首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在实体框架TPH中映射子类值

在实体框架TPH中映射子类值
EN

Stack Overflow用户
提问于 2015-08-18 21:43:11
回答 2查看 1.1K关注 0票数 2

我是第一次在C# MVC中设置TPH继承,我对如何将子类值映射到表有点困惑。例如,我的父实体的流畅映射是使用以下命令声明的:

代码语言:javascript
复制
public class ProjectTaskMap : EntityTypeConfiguration<ProjectTask>

我使用以下命令设置了单独的地图:

代码语言:javascript
复制
Map<ProjectTL>(m => m.Requires("Type").HasValue("TL"));

再举一个例子:其中一个子类需要有多对多的映射。我不知道如何使用TPH来配置它,因为我不能访问子类的属性来声明映射。

但是,我不能访问这个父映射中的子类属性(因为它调用了ProjectTask的配置)。我不能指定如何将字段映射到表,我不能对它们做任何事情。

为了能够做到这一点,我错过了什么?这是一个刚刚升级到EF 6.1的旧系统,所以我没有EF Designer或类似的东西,只有这些流畅的映射。

父类:

代码语言:javascript
复制
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是多对多关系的一部分。

代码语言:javascript
复制
public class ProjectET : ProjectTask
{
    public virtual int SalesOrderId { get; set; }

    public virtual SalesOrder SalesOrder { get; set; }
    public ICollection<EngChangeOrders> ECOs { get; set; }
}
EN

回答 2

Stack Overflow用户

发布于 2015-08-18 23:08:59

在使用Code First创建模型时,TPH是参与继承层次结构的类型的默认策略。看看下面的结构:

代码语言:javascript
复制
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; }
}

映射:

代码语言:javascript
复制
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);
    }


}

生成的迁移

代码语言:javascript
复制
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);

这对你有效吗?

票数 0
EN

Stack Overflow用户

发布于 2015-08-19 03:42:15

你的流畅配置显然一次只能处理一种实体类型,但是没有什么能阻止你为你的子类添加流畅配置。不确定这里的复杂性是什么。

代码语言:javascript
复制
public class ProjectETMap : EntityTypeConfiguration<ProjectET>
{
    public ProjectETMap()
    {
        HasMany(m => m.ECOs).WithMany();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32074162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档