我是第一次在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; }
}两个子类没有自己的属性(它们是空的shell),但第三个子类有。ECOs是多对多关系的一部分。
public class ProjectET : ProjectTask
{
public virtual int SalesOrderId { get; set; }
public virtual SalesOrder SalesOrder { get; set; }
public ICollection<EngChangeOrders> ECOs { get; set; }
}发布于 2015-08-18 23:08:59
在使用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);这对你有效吗?
发布于 2015-08-19 03:42:15
你的流畅配置显然一次只能处理一种实体类型,但是没有什么能阻止你为你的子类添加流畅配置。不确定这里的复杂性是什么。
public class ProjectETMap : EntityTypeConfiguration<ProjectET>
{
public ProjectETMap()
{
HasMany(m => m.ECOs).WithMany();
}
}https://stackoverflow.com/questions/32074162
复制相似问题