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删除其中一个TaskIdFileId属性,并使其余的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 – 左外连接? 。