EF6外键具有一对一关系和双向属性导航

时间:2017-02-28 17:39:02

标签: entity-framework entity-framework-6 foreign-key-relationship one-to-one

当我使用双向导航时,我似乎无法让EF6生成FK。

以下是我的课程(为简洁起见,删除了一些属性):

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引用返回BaseSystem.Id

这是我的流利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,同时还要进行双向导航?

1 个答案:

答案 0 :(得分:1)

使用一对一关系时,EF6使用子级中的Id列作为父级的FK,它不会创建第二列FK,因为这将被视为一对多关系,因为第二列将允许父{4}存在于许多子条目中,而 PK为FK 不会。

当您从父类中删除Id属性时,EF6会理解您的子类有一个必需的Configuration作为父级,但没有任何说它应该是一个一对一,所以EF6默认会将其视为一对多关系,因为它创建了第二列,这将允许许多子条目中的同一父级。

  

有些人可能会说你可以为那一秒创建一个唯一索引   列为FK以避免具有相同的父ID,但EF6不起作用   这样(也许他们认为这样做没有意义)。

您尝试的第一个选项是配置一对一关系的正确方法,System中的Id是PK,FK是SystemConfiguration同一时间。