我是第一次在C#MVC中设置TPH继承,我对如何将子类值映射到表格感到有点困惑。例如,我的父实体的流畅地图使用:
声明public class ProjectTaskMap : EntityTypeConfiguration<ProjectTask>
我使用以下方式设置了各个地图:
Map<ProjectTL>(m => m.Requires("Type").HasValue("TL"));
作为另一个例子:其中一个子类需要具有多对多映射。我不知道如何使用TPH配置它,因为我无法访问子类的属性来声明映射。
然而,我无法访问此父地图中的子类属性(因为它正在调用ProjectTask
的配置)。我无法指定如何将字段映射到表格,我无法对其进行任何操作。
我能错过什么才能做到这一点?这是一个刚刚升级到EF 6.1的旧系统,所以我没有EF Designer或类似的东西,只有这些流畅的映射。
家长班:
public class ProjectTask : BaseEntity
{
public virtual int ProjectId { get; set; }
// various other properties
public virtual Project Project { get; set; }
public virtual ICollection<ProjectTaskFile> Files { get; set; }
}
两个子类没有自己的属性(它们是空壳),但第三个没有。 ECOs
是多对多关系的一部分。
public class ProjectET : ProjectTask
{
public virtual int SalesOrderId { get; set; }
public virtual SalesOrder SalesOrder { get; set; }
public ICollection<EngChangeOrders> ECOs { get; set; }
}
答案 0 :(得分:0)
使用Code First创建模型时,TPH是参与继承层次结构的类型的默认策略。看看以下结构:
public class Project
{
public int ProjectId { get; set; }
}
public class ProjectTask
{
public int ProjectTaskId { get; set; }
public virtual Project Project { get; set; }
public string SomeString { get; set; }
}
public class ProjectET : ProjectTask
{
public ICollection<Order> ECOs { get; set; }
}
public class Order
{
public int OrderId { get; set; }
public string SomeString { get; set; }
}
映射:
public class Context : DbContext
{
public Context() : base("Model2")
{
}
public DbSet<Project> Projects { get; set; }
public DbSet<ProjectET> ProjectETs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Project>()
.HasKey(i => i.ProjectId);
modelBuilder.Entity<ProjectTask>()
.HasKey(i => i.ProjectTaskId);
base.OnModelCreating(modelBuilder);
}
}
生成的迁移
CreateTable(
"dbo.ProjectTasks",
c => new
{
ProjectTaskId = c.Int(nullable: false, identity: true),
SomeString = c.String(),
Discriminator = c.String(nullable: false, maxLength: 128),
Project_ProjectId = c.Int(),
})
.PrimaryKey(t => t.ProjectTaskId)
.ForeignKey("dbo.Projects", t => t.Project_ProjectId)
.Index(t => t.Project_ProjectId);
CreateTable(
"dbo.Orders",
c => new
{
OrderId = c.Int(nullable: false, identity: true),
SomeString = c.String(),
ProjectET_ProjectTaskId = c.Int(),
})
.PrimaryKey(t => t.OrderId)
.ForeignKey("dbo.ProjectTasks", t => t.ProjectET_ProjectTaskId)
.Index(t => t.ProjectET_ProjectTaskId);
CreateTable(
"dbo.Projects",
c => new
{
ProjectId = c.Int(nullable: false, identity: true),
})
.PrimaryKey(t => t.ProjectId);
这对你有用吗?
答案 1 :(得分:0)
您的流畅配置显然一次只能解决一个实体类型,但没有什么能阻止您为子类添加流畅的配置。不知道这里有什么复杂情况。
public class ProjectETMap : EntityTypeConfiguration<ProjectET>
{
public ProjectETMap()
{
HasMany(m => m.ECOs).WithMany();
}
}