当我使用双向导航时,我似乎无法让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,同时还要进行双向导航?
答案 0 :(得分:1)
使用一对一关系时,EF6使用子级中的Id
列作为父级的FK,它不会创建第二列FK,因为这将被视为一对多关系,因为第二列将允许父{4}存在于许多子条目中,而 PK为FK 强>不会。
当您从父类中删除Id
属性时,EF6会理解您的子类有一个必需的Configuration
作为父级,但没有任何说它应该是一个一对一,所以EF6默认会将其视为一对多关系,因为它创建了第二列,这将允许许多子条目中的同一父级。
有些人可能会说你可以为那一秒创建一个唯一索引 列为FK以避免具有相同的父ID,但EF6不起作用 这样(也许他们认为这样做没有意义)。
您尝试的第一个选项是配置一对一关系的正确方法,System
中的Id
是PK,FK是SystemConfiguration
同一时间。