我在数据库级别有以下超类型/子类型模式:
MotherTable
- MainDiscriminator
- CommonAttribute1
- CommonAttribute2
ChildTable1
- MainDiscriminator (value: 1)
- AdditionalAttributes...
ChildTable2
- MainDiscriminator (value: 2)
- AdditionalAttributes...
在此之前,相当典型的映射实现配置:
Map<ChildTable1>(m => m.Requires("MainDiscriminator").HasValue("1"));
Map<ChildTable2>(m => m.Requires("MainDiscriminator").HasValue("2"));
现在我遇到的问题是配置第二级继承; ChildTable2有一个大孩子,有一个不同的鉴别器,MotherTable一无所知。看起来像这样
ChildTable2
- MainDiscriminator (value: 2)
- AdditionalAttributes...
- SecondaryDiscriminator
GrandChild1
- SecondaryDiscriminator (value: 1)
- AdditionalAttributes...
GrandChild2
- SecondaryDiscriminator (value: 2)
- AdditionalAttributes...
我尝试了各种方法,但是我遇到了错误配置,说明两个实体正在映射到同一行,或者EF尝试在MotherTable中为名为“Discriminator”的非现有列输入空值
似乎允许解决此问题的一个途径是DbInterceptor删除那些不需要的“Discriminator”列插入/更新/删除,但我宁愿不去那里。
任何想法/想法都会受到赞赏。
答案 0 :(得分:1)
当我写这篇文章时,你可能已经找到了解决方案。不过,我这样做了,所以你可能会对表中的其他选项有所了解。
我可以说你的案例是在EF 6中实施TpT(每类型表格)继承的正确案例。
所以,这是我对案例的看法,从简单的POCO类开始:
public class MotherTable
{
public int MotherId { get; set; }
public int MainDiscriminator { get; set; }
public string CommonAttribute1 { get; set; }
public string CommonAttribute2 { get; set; }
}
public class ChildTable1 : MotherTable
{
public string AdditionalAttribute1 { get; set; }
}
public class ChildTable2 : MotherTable
{
public int SecondaryDiscriminator { get; set; }
public string AdditionalAttribute2 { get; set; }
}
public class GrandChild1 : ChildTable2
{
public string AdditionalAttributes21 { get; set; }
}
public class GrandChild2 : ChildTable2
{
public string AdditionalAttributes22 { get; set; }
}
使用流畅的API(代码优先方案)在EF 6中进行设置,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MotherTable>().ToTable("MotherTable").HasKey<int>(c => c.MotherId);
modelBuilder.Entity<ChildTable1>().ToTable("ChildTable1");
modelBuilder.Entity<ChildTable2>().ToTable("ChildTable2");
modelBuilder.Entity<GrandChild1>().ToTable("GrandChild1");
modelBuilder.Entity<GrandChild2>().ToTable("GrandChild2");
}
通过运行此代码段进行测试:
using (var context = new StackoverflowEntities())
{
var account1 = new GrandChild1
{
MotherId = 1,
MainDiscriminator = 2,
CommonAttribute1 = "Mother common 1",
CommonAttribute2 = "Mother common 2",
AdditionalAttribute2 = "Child Add Attr 2",
AdditionalAttributes21 = "Grand Child Add Attr 2.1",
SecondaryDiscriminator = 1
};
var accounts1 = context.Set<GrandChild1>();
accounts1.Add(account1);
var account2 = new GrandChild2
{
MotherId = 2,
MainDiscriminator = 2,
CommonAttribute1 = "Mother common 1",
CommonAttribute2 = "Mother common 2",
AdditionalAttribute2 = "Child Add Attr 2",
AdditionalAttributes22 = "Grand Child Add Attr 2.2",
SecondaryDiscriminator = 2
};
var accounts2 = context.Set<GrandChild2>();
accounts2.Add(account2);
context.SaveChanges();
}
它将生成如下数据库模式:
并将分发插入的数据(来自上面的代码段),如下所示:
我希望这篇文章可以为您提供一些考虑因素,即使您已经修复了代码,但这并不是您想要的。或者也许你可以告诉我一些我不知道的事情,如果有的话。