我在使用实体框架将现有数据库映射到代码库时遇到问题。我似乎也找不到任何类似的代码。我需要有多层继承,我需要这些层使用两种不同的映射类型。我有一些奇怪的行为。为了重现该行为,我创建了一个简单的模型并允许 EF 以它希望的方式对其进行映射。
我的实体如下:
public abstract class Root
{
public int RootId { get; set; }
public string RootProperty { get; set; }
}
public abstract class ChildA : Root
{
public string ChildAProperty { get; set; }
}
public class ChildB : Root
{
public string ChildBProperty { get; set; }
}
public class SubChildAa : ChildA
{
public string SubChildAaProperty { get; set; }
}
public class SubChildAb : ChildA
{
public string SubChildAbProperty { get; set; }
}
这会产生以下架构:
我的上下文如下:
class MyContext : DbContext
{
public DbSet<SubChildAa> ChildAas { get; set; }
public DbSet<SubChildAb> ChildAbs { get; set; }
public DbSet<ChildB> ChildBs { get; set; }
public MyContext()
{
//Database.SetInitializer<MyContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Root>().ToTable("Root");
modelBuilder.Entity<ChildB>().ToTable("ChildB");
modelBuilder.Entity<ChildA>().ToTable("ChildA");
modelBuilder.Entity<ChildA>().Map<SubChildAa>(u => u.Requires("ChildAType").HasValue("SubChildAa"));
modelBuilder.Entity<ChildA>().Map<SubChildAb>(u => u.Requires("ChildAType").HasValue("SubChildAb"));
//base.OnModelCreating(modelBuilder);
}
}
我正在尝试将 TPT 用于 Root 到 Child(A 或 B)的映射,并将 TPH 用于 ChildA 到 SubChild。主要问题是 EF 将鉴别器放在 Root 对象上。它还将 ChildA 属性放在那里,我认为这是不正确的,但现在问题不大。由于鉴别器位于根上,它会导致错误,因为 ChildB 未映射到该鉴别器中的类型。
有人可以建议一种我可以让 ChildA 表实际维护其自己的属性和鉴别器而不将它们推到根表的方法。