1

我似乎无法在使用双向导航时使EF6生成FK。具有一对一关系和双向属性导航的EF6外键

这里是我的班(除去简洁一些属性):

public class BaseSystem 
{ 
    public int Id { get; set; } 
    public SystemConfiguration Configuration { get; set; } 
} 

public class SystemConfiguration 
{ 
    public int Id { get; set; } 
    public BaseSystem System { get; set; } 
} 

我想SystemConfiguration表有一个FK参考回到​​。

这里是我的一口流利的API代码:

modelBuilder.Entity<SystemConfiguration>() 
    .HasRequired(x => x.System) 
    .WithOptional(x => x.Configuration); 

当我使用双向导航时,产生这种迁移,这似乎产生FK起初:

CreateTable(
    "MYDB.SYSTEMCONFIGURATION", 
    c => new 
     { 
      ID = c.Decimal(nullable: false, precision: 10, scale: 0) 
     }) 
    .PrimaryKey(t => t.ID) 
    .ForeignKey("MYDB.BASESYSTEM", t => t.ID); 

注意到,在SQL后它生成的不包括FK,我删除了BaseSystem.Configuration属性,迁移生成这个:

CreateTable(
    "MYDB.SYSTEMCONFIGURATION", 
    c => new 
     { 
      ID = c.Decimal(nullable: false, precision: 10, scale: 0, identity: true), 
      SYSTEM_ID = c.Decimal(nullable: false, precision: 10, scale: 0), 
     }) 
    .PrimaryKey(t => t.ID) 
    .ForeignKey("CISRF.BASESYSTEM", t => t.SYSTEM_ID, cascadeDelete: true); 

我的SQL也会生成"SYSTEM_ID" number(10, 0) not null,如果我有双向导航,它不会这样做。

我需要做什么来在SystemConfiguration表上生成FK,同时还有双向导航?

+0

您不能(EF限制) - 请参阅[EF Code First中的关联:第5部分 - 一对一外键关联](https://weblogs.asp.net/manavi/associations-in-ef -4-1 - 编码 - 第一部分-5-酮对一外键的协会)。 –

回答

1

一到一个关系工作,EF6使用Id列在孩子的FK到父,它不会FK创建第二个列,因为这会被认为是一个到-many关系,因为该第二列将允许父子代Id存在于许多子条目中,而PK作为FK则不允许。

当您从类中删除了Configuration财产,EF6了解你的孩子上课了所需System作为父母,但没有什么说这应该是一个对一个,所以EF6会当作一个一对多关系默认情况下,因为它创建了第二列,这将允许许多子条目中相同的父项。

也许有人会说,你可以为第二 列FK避免具有相同父节点ID创建唯一索引,但EF6不起作用 这样(也许他们认为这不会使感觉这样做)。

您尝试的第一个选项是配置一个一对一关系的正确方法,并在SystemConfigurationId是PK和FK到BaseSystem在同一时间。

+0

你的第一句话总结了一切(你对一对多也是正确的)。起初很难注意到,因为按照惯例,我习惯于看到名为Parent_Id的FK。我从来没有想过在一对一的关系中使用ID作为FK。所以我重新编写了一切,现在按照您的说明进行配置。 – oscilatingcretin

+0

@oscilatingcretin我在一家公司工作,他们也使用'Parent_Id'约定,但是在开始使用EF时遇到了同样的问题/疑问。这就是为什么我很快就理解你的问题,这是一个很好的问题。 – Alisson

相关问题