我有一个模型,其中有两个级别的继承,以及两个表,更像是这样:
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;