gpt4 book ai didi

c# - 在 Entity Framework TPH 中映射子类值

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:13 24 4
gpt4 key购买 nike

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

public class ProjectTaskMap : EntityTypeConfiguration<ProjectTask>

我有单独的 map 设置使用:

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);

这对你有用吗?

关于c# - 在 Entity Framework TPH 中映射子类值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com