【问题标题】:Custom naming for key fields does not work in TPT(Table Per Type) strategy in EF关键字段的自定义命名在 EF 中的 TPT(Table Per Type) 策略中不起作用
【发布时间】:2014-10-06 05:39:53
【问题描述】:

我首先使用带有.NET 4SQL Server 2008 R2 的EF 6.1.1 代码,并且在我的项目中有以下类:

public abstract class BaseEntity
{
    public int Id { get; set; }
}

public class Document : BaseEntity
{
    public string Number { get; set; }
}

public class OrderHeader : Document
{
    public OrderHeader()
    {
        this.OrderItems = new List<OrderItem>();
    }
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem : Document
{
    public int OrderHeaderId { get; set; }
    public virtual OrderHeader OrderHeader { get; set; }
}

我想要

  • 使用TPT(Table Per Type) 继承策略。
  • OrderHeaderOrderItem表的key字段为DocumentId

所以我定义了以下映射文件:

public class Document_Mapping : EntityTypeConfiguration<Document>
{
   public Document_Mapping()
   {
        ToTable("Document");
   }
}

public class OrderHeader_Mapping : EntityTypeConfiguration<OrderHeader>
{
    public OrderHeader_Mapping()
    {
        ToTable("OrderHeader");
        Property(t => t.Id).HasColumnName("DocumentId");
    }
}

public class OrderItem_Mapping : EntityTypeConfiguration<OrderItem>
{
    public OrderItem_Mapping()
    {
        ToTable("OrderItem");
        Property(t => t.Id).HasColumnName("DocumentId");
        HasRequired(t => t.OrderHeader)
       .WithMany(t => t.OrderItems)
       .HasForeignKey(d => d.OrderHeaderId);
    }
}

使用它们是我的DbContext 文件:

public class MyDbContext:DbContext
{
    public MyDbContext()
        : base("name=MyContext")
    {

       Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Configurations.Add(new Document_Mapping());
        modelBuilder.Configurations.Add(new OrderHeader_Mapping());
        modelBuilder.Configurations.Add(new OrderItem_Mapping());
    }
    public DbSet<OrderItem> OrderItems { get; set; }
    public DbSet<OrderHeader> OrderHeaders { get; set; }
}

但是当我运行程序时,创建的表看起来像:

OrderHeaderOrderItem 表生成的键列是Id,但在映射中我将它们定义为DocumentId

有人知道问题出在哪里吗?

【问题讨论】:

    标签: c# entity-framework inheritance ef-code-first table-per-type


    【解决方案1】:

    更新到 EF 6.1.2-beta1 或更高版本。

    这是一个错误,已在此处修复:https://entityframework.codeplex.com/workitem/2087

    【讨论】:

    • 我需要IdBaseEntity 中,因为我在我的项目中广泛使用BaseEntity 并假设它有Id,但是我应用了你提到的更改,但没有任何改变.
    • 你可以从dropbox.com/s/ud5oi13qa14p7bl/Inheritance.rar?dl=0得到我的测试项目
    • EF 6.1.2-beta2 可用吗?我无法得到它。
    • 你可以从 NIghly 构建中获得它,但 6.1.2-beta1 也应该有修复
    • 现在可以使用EF 6.1.2-beta1,即使我使用BaseEntity。请更新您的答案,无需删除BaseEntity。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多