首先是EF代码 - 在没有共享PK / FK

时间:2017-05-24 16:45:33

标签: c# sql-server entity-framework

我正在尝试在两个实体之间建立一对一或零关系,我希望依赖实体仍然包含自己的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<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属性?

干杯!

1 个答案:

答案 0 :(得分:3)

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

所以要么继续使用你现在拥有的东西 - Shared Primary Key association。只需从TaskId中删除其中一个FileIdTask属性,然后将其余的PK(EF将自动将其用作FK,因为它是默认的EF {{ 1}}关系模型)。

或者从one-to-one删除FieldId属性并使用以下流畅配置(所有都是必需的):

Task

但我建议使用第一种方法(如果没有特殊原因不像现有数据库那样做),因为它得到了更好的支持 - 第二种方法包括SQL查询中的一些modelBuilder.Entity<File>() .HasOptional(f => f.Task) .WithRequired(t => t.File) .Map(m => m.MapKey("FileId")) .WillCascadeOnDelete(); 你可以从这篇文章中看到EF - WithOptional - Left Outer Join?

相关问题