2017-05-24 55 views
0

我试图在两个实体之间建立一对一或一对一的关系,并且我希望依赖实体仍然包含它自己的Indentity列,而不是共享密钥。EF代码优先 - 配置一对零关系但不共享PK/FK

我想要做的尽可能的按照约定,而不是宣布明确的东西,不需要明确的声明(因此,没有不必要数据注释或流畅API条款)

的entites的:

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); 
     } 

这将创建一个奇怪的关系,其中TaskId是Tasks表的PK和FK列。我认为这意味着它应该与文件ID具有相同的值? (这是一个问题:))

那么,我该如何让TaskId保持自己的顺序值,并让FileId成为Files表的外键呢?

或者在1-0..1的情况下,我应该摆脱TaskId属性并使FileId成为PK/FK属性?

干杯!

回答

2

双向one-to-one与显式FK属性的关系不受支持。

因此,要么继续使用你现在拥有的 - Shared Primary Key association。只需要从Task中删除TaskIdFileId属性中的一个,并使剩余的一个PK(EF将自动使用它作为FK,因为这是默认的EF one-to-one关系模型)。

或者从Task摆脱FieldId财产,并使用下面的流畅配置(全部是必要的):

modelBuilder.Entity<File>() 
    .HasOptional(f => f.Task) 
    .WithRequired(t => t.File) 
    .Map(m => m.MapKey("FileId")) 
    .WillCascadeOnDelete(); 

但我会建议使用第一种方式(如果不这样做没有什么特别的理由它像现有的数据库等),因为它更好的支持 - 第二个包括在SQL查询中的一些LEFT OUTER JOIN s,你可以从这篇文章EF - WithOptional - Left Outer Join?看到。

+0

非常感谢,很好的回答:) – Bartosz