具有一对一关系和双向 属性 导航的 EF6 外键
EF6 Foreign key with one-to-one relationship and two-way property navigation
当我使用双向导航时,我似乎无法让 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
table 有一个 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
table 上生成 FK,同时还具有双向导航?
使用 one-to-one 关系时,EF6 使用 child 中的 Id
列作为 parent, 它不会为 FK 创建第二列,因为这将被视为 one-to-many 关系,因为第二列将允许 parent Id
存在于许多 child 条目中,而 PK 作为 FK 则不会。
当您从 parent class 中删除 Configuration
属性 时,EF6 理解了您的 child class 有一个必需的 System
作为 parent,但没有说它应该是 one-to-one,因此 EF6 将视为 one-to-many relationship 默认情况下,因为它创建了第二列,这将允许在许多 child 条目中使用相同的 parent。
Some may argue you could create a unique index for that second
column as FK to avoid having the same parent id, but EF6 doesn't work
this way (maybe they think it doesn't make sense doing this).
您尝试的第一个选项是配置 one-to-one 关系的正确方法,SystemConfiguration
中的 Id
是 PK 和 FK 到 BaseSystem
同时
当我使用双向导航时,我似乎无法让 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
table 有一个 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
table 上生成 FK,同时还具有双向导航?
使用 one-to-one 关系时,EF6 使用 child 中的 Id
列作为 parent, 它不会为 FK 创建第二列,因为这将被视为 one-to-many 关系,因为第二列将允许 parent Id
存在于许多 child 条目中,而 PK 作为 FK 则不会。
当您从 parent class 中删除 Configuration
属性 时,EF6 理解了您的 child class 有一个必需的 System
作为 parent,但没有说它应该是 one-to-one,因此 EF6 将视为 one-to-many relationship 默认情况下,因为它创建了第二列,这将允许在许多 child 条目中使用相同的 parent。
Some may argue you could create a unique index for that second column as FK to avoid having the same parent id, but EF6 doesn't work this way (maybe they think it doesn't make sense doing this).
您尝试的第一个选项是配置 one-to-one 关系的正确方法,SystemConfiguration
中的 Id
是 PK 和 FK 到 BaseSystem
同时