繁体   English   中英

具有多级继承的实体配置

[英]Entity Configuration with multiple level inheritance

我在数据库级别具有以下超类型/子类型模式:

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”列插入/更新/删除,但是我不想去那儿。

任何想法/想法将不胜感激。

在我撰写本文时,您可能已经找到了解决方案。 尽管如此,我还是这样做了,因此您可能会对表中的其他选项有所了解。

我可以说您的案例是在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; }
}

使用这样的fluent 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();
}

它将生成这样的数据库模式:

在此处输入图片说明

并将分发插入的数据(来自上面的代码段),如下所示:

在此处输入图片说明

我希望这篇文章可以给您一些考虑,即使您已修正代码,也不完全是您想要的。 或者,也许您可​​以告诉我一些我不知道的东西(如果有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM