繁体   English   中英

在Entity Framework TPH中映射子类值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM