Search code examples
c#entity-frameworkinheritanceef-code-firsttable-per-type

Custom naming for key fields does not work in TPT(Table Per Type) strategy in EF


I'm using EF 6.1.1 code first with .NET 4 and SQL Server 2008 R2 and have following classes in my project:

enter image description here

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

I want to

  • Use TPT(Table Per Type) inheritance strategy.
  • The key field of OrderHeader and OrderItem tables be DocumentId.

So I defined following mapping files:

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

And use them is my DbContext file:

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

But when I run the program the created tables look like: enter image description here

The generated key columns for OrderHeader and OrderItem tables are Id, but in mapping I defined them to be DocumentId.

Does any one know where is the problem?


Solution

  • Update to EF 6.1.2-beta1 or later.

    This is a bug, that was fixed here: https://entityframework.codeplex.com/workitem/2087