C# EF代码优先-配置一对零或无共享PK/FK的一对一关系
我试图在两个实体之间建立一对零或一的关系,我希望依赖实体仍然包含自己的标识列,而不是共享键 我希望尽可能多地遵循约定,不要显式声明任何不需要显式声明的内容(因此,不要不必要的数据注释或fluent-api子句) 实体:C# EF代码优先-配置一对零或无共享PK/FK的一对一关系,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我试图在两个实体之间建立一对零或一的关系,我希望依赖实体仍然包含自己的标识列,而不是共享键 我希望尽可能多地遵循约定,不要显式声明任何不需要显式声明的内容(因此,不要不必要的数据注释或fluent-api子句) 实体: public class File { public int FileId {get;set;} //some omitted file properties public virtual Task Task {get;set;} } public cl
public class File
{
public int FileId {get;set;}
//some omitted file properties
public virtual Task Task {get;set;}
}
public class Task
{
public int TaskId {get;set;}
//some omitted task properties
public int FileId {get;set;}
public virtual File File {get;set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<File>().HasOptional(f => f.Task).WithRequired(t => t.File);
base.OnModelCreating(modelBuilder);
}
公共类文件
{
public int FileId{get;set;}
//一些省略的文件属性
公共虚拟任务任务{get;set;}
}
公开课任务
{
public int TaskId{get;set;}
//一些省略的任务属性
public int FileId{get;set;}
公共虚拟文件{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(f=>f.Task).WithRequired(t=>t.File);
基于模型创建(modelBuilder);
}
这会创建一个奇怪的关系,其中TaskId同时是Tasks表的PK和FK列。我认为这意味着它应该与文件ID具有相同的值?(这是一个问题:))
那么,如何使TaskId保持其自身的顺序值,并使FileId成为Files表的外键呢
或者,在1-0..1的情况下,我宁愿放弃TaskId属性,而让FileId成为PK/FK属性
干杯 不支持具有显式FK属性的双向一对一
关系
所以要么继续使用你现在拥有的-。只需去掉Task
中的一个TaskId
或FileId
属性,并将其余属性设置为PK(EF将自动将其用作FK,因为这是默认的EF一对一关系模型)
或者从Task
中删除FieldId
属性,并使用以下流畅配置(所有配置都是必需的):
modelBuilder.Entity()
.has可选(f=>f.Task)
.WithRequired(t=>t.File)
.Map(m=>m.MapKey(“文件ID”))
.WillCascadeOnDelete();
但我建议使用第一种方法(如果没有特殊原因不使用现有数据库等),因为它得到了更好的支持-第二种方法包括SQL查询中的一些左外连接,正如您在本文中看到的那样。非常感谢,回答很好:)
modelBuilder.Entity<File>()
.HasOptional(f => f.Task)
.WithRequired(t => t.File)
.Map(m => m.MapKey("FileId"))
.WillCascadeOnDelete();