[英]Mapping subclass values in Entity Framework TPH
我是第一次在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; }
}
使用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);
那对你有用吗?
你流利的配置显然只能在同一时间处理一个单一的实体类型,但没有什么东西将流利的配置为你的子类,以及阻止你。 不知道这里有什么并发症。
public class ProjectETMap : EntityTypeConfiguration<ProjectET>
{
public ProjectETMap()
{
HasMany(m => m.ECOs).WithMany();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.