我遇到使用实体框架将现有数据库映射到代码库的问题。我似乎无法找到任何类似的代码。我需要有多层继承,我需要使用两种不同的映射类型。我虽然有一些奇怪的行为。为了重现这种行为,我创建了一个简单的模型,并允许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 to Child(A或B)映射,将TPH用于ChildA到SubChild。主要问题是EF将鉴别器放在Root对象上。它也将ChildA属性放在那里,我认为这是不正确的,但现在不是问题。如果鉴别器位于Root上,则会导致错误,因为ChildB不会映射到该鉴别器中的类型。
有人可以提出一种方法,让我可以让ChildA表实际保持自己的属性和鉴别器而不将它们推送到根表。
答案 0 :(得分:0)
像这样的东西
public abstract class Root
{
[Key]
public int RootId { get; set; }
public string RootProperty { get; set; }
}
public class ChildA : Root
{
[Required]
int RootId
ForeignKey["RootId"]
public Root Root {get;set;}
public string ChildAProperty { get; set; }
}
public class ChildB : Root {
[Required]
int RootId
ForeignKey["RootId"]
public Root Root {get;set;}
public string ChildBProperty { get; set; }
}
public class SubChildAa : ChildA
{
public string SubChildAaProperty { get; set; }
}
public class SubChildAb : ChildA
{
public string SubChildAbProperty { get; set; }
}
在您的上下文中,您需要TPT for ChildA和ChildB
所以
public DbSet<ChildA> ChildAas { get; set; }
public DbSet<ChildB> ChildBs { get; set; }
子孙的TPH
public DbSet<SubChild> Childs { get; set; }