在EF模型实体的层次结构中添加中间基类

时间:2016-06-30 00:59:01

标签: c# entity-framework odata

我有一个模型,其中有两个级别的继承,以及两个表,更像是这样:

public abstract class A
{
    public string FooA { get; set; }
}

public class B : A
{
    public string FooB { get; set; }
}

public class DX : B
{
    public string FooC { get; set; }
    public string FooDX { get; set; }
}

public class DY : B
{
    public string FooC { get; set; }
    public string FooDY { get; set; }
}

modelBuilder.Entity<B>().ToTable("B", SchemaName);   // B table has columns FooA and FooB
modelBuilder.Entity<DX>().ToTable("DX", SchemaName); // DX table has columns FooC and FooDX
modelBuilder.Entity<DY>().ToTable("DY", SchemaName); // DY table has columns FooC and FooDY

这很有效。但随着时间的推移,DX和DY已经发展到了拥有多个重复领域的地步。我正在寻找一种方法将公共部分重构为基类,更像是这样:

public abstract class C : B
{
    public string FooC { get; set; }
}

public class DX : B
{
    public string FooDX { get; set; }
}

public class DY : B
{
    public string FooDY { get; set; }
}

我无法修改数据库,但拥有DX和DY的通用类会让我的生活变得更轻松。但是,当我尝试这个时,我得到了以下错误:

  

&#34;无效的列名称&#39; Discriminator&#39;。列名称无效&#39; FooC&#39;。

&#34; Discriminator&#34;部分让我觉得实体框架试图查询&#34; C&#34;来自&#34; B&#34;表而不是&#34; DX&#34;和&#34; DY&#34;表。

如果没有修改数据库并保持三级继承,是否有解决此问题的方法?

更新:我认为应该使用Table-Per-Concrete Class (TPC) Inheritance修复此问题,因此我将abstract类设为我不希望映射到表的类并将我的模型更新为:

modelBuilder.Entity<B>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("B", SchemaName);
});

modelBuilder.Entity<DX>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("DX", SchemaName);
});

modelBuilder.Entity<DY>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("DY", SchemaName);
});

但后来我收到以下错误:

  

&#34;类型&#39; DY&#39;无法按定义映射,因为它映射了使用实体拆分或其他形式的继承的类型的继承属性。选择不同的继承映射策略,以便不映射继承的属性,或更改层次结构中的所有类型以映射继承的属性,并且不使用拆分。 &#34;

0 个答案:

没有答案