【发布时间】:2017-11-19 01:33:51
【问题描述】:
我正在尝试在 EF 中建模一个结构,其中我们有多个实体,每个实体都有本地化内容。所有这些本地化内容都存在于一个表中。 (见下例)
我遇到了一个问题,当我使用流畅的语法定义外键时,并且当 EF 运行迁移以构建数据库时,它将在本地化表中的 LKey 字段上应用多个外键。即FK_Localization_Foo1_LKey/FK_Localization_Foo2_LKey。
这是不正确的,因为现在不可能在本地化表中插入任何记录。
我怎样才能停止这种行为,或者我应该改变什么来实现我在 EF 中寻找的东西?
附言我已经看到建议在哪里创建中间表的示例,该表仅包含 LKey 作为其主键,其他表引用此表。如果可能的话,我想避免这种情况,以使我们的 DBA 满意。
public class Foo
{
...
[Required][StringLength(5)]
public string LKey { get; set; }
public ICollection<Localization> Localizations { get; set; }
}
// many entities similar to 'foo' with the same navigation
public class Localization
{
public int LocalizationId { get; set; }
[Required][StringLength(5)]
public string LKey { get; set; }
[Required][StringLength(10)]
public string LangISO { get; set; }
...
}
// inside the OnModelCreating method, there are multiple entries like the below, one for each 'Foo' type entity above
modelBuilder.Entity<Foo>()
.HasMany(pt => pt.Localizations)
.WithOne()
.HasPrincipalKey(pt => pt.LKey)
.HasForeignKey(l => l.LKey);
更新: 以下是当前针对此 DB 运行的查询示例(并且已经运行多年),因此可以肯定地说,该模型与 RDB 不兼容。
当我去询问时,我们的 DBA 跟进“这绝对有可能。它有效,因为存在关系,但没有外键 约束。它不是 NF,但它工作得很好。”
也许我最初的问题并不清楚,如果是这种情况,我们深表歉意。我们要做的是对关系进行建模,并允许在模型上进行正常的 EF 导航(这适用于上述情况代码),但没有有迁移创建 FKey。
select f1.Foo1Id, ll.Text from Foo1 f1
inner join LocalizationLanguage ll on ll.DescriptionKey = f1.DescriptionKey
select f2.Foo2Id, ll.Text from Foo2 f2
inner join LocalizationLanguage ll on ll.DescriptionKey = f2.DescriptionKey
【问题讨论】:
标签: entity-framework-core foreign-key-relationship entity-framework-migrations