繁体   English   中英

EF代码优先-在不共享PK / FK的情况下配置一对零或一对关系

[英]EF code first - configure One-to-Zero-or-One relationship without shared 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<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属性?

干杯!

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

因此,要么继续使用您现在拥有的“ 共享主键”关联 只需从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 ,您可以从EF这篇文章中看到- WithOptional-左外部联接?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM