EF代码优先 – 在没有共享PK / FK的情况下配置一对一或零关系
我试图在两个实体之间建立一对一或零关系,我希望依赖实体仍然包含自己的Indentity列,而不是它是一个共享密钥。
我希望尽可能遵循约定,并且不要明确声明任何不需要显式声明的内容(因此,没有不必要的数据注释或流畅的api子句)
参与者:
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().HasOptional(f => f.Task).WithRequired(t => t.File); base.OnModelCreating(modelBuilder); }
这会创建一个奇怪的关系,其中TaskId是Tasks表的PK和FK列。 其中,我认为它应该与文件ID具有相同的值? (这是一个问题:))
那么,如何使TaskId保持自己的顺序值并让FileId成为Files表的外键?
或者也许在1-0..1的情况下我宁愿摆脱TaskId属性并使FileId成为PK / FK属性?
干杯!
不支持具有显式FK属性的双向one-to-one
关系。
所以要么继续使用你现在拥有的东西 – 共享主键关联 。 只需从Task
删除其中一个TaskId
或FileId
属性,并使其余的PK(EF将自动将其用作FK,因为这是默认的EF one-to-one
关系模型)。
或者从Task
删除FieldId
属性并使用以下流畅配置(所有都是必需的):
modelBuilder.Entity() .HasOptional(f => f.Task) .WithRequired(t => t.File) .Map(m => m.MapKey("FileId")) .WillCascadeOnDelete();
但我建议使用第一种方法(如果没有特殊原因不像现有的数据库那样做),因为它更好地支持 – 第二种方法包括SQL查询中的一些LEFT OUTER JOIN
,你可以从这篇文章EF中看到- WithOptional – 左外连接? 。