Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 6 & TPH inheritance: Map properties with the same name to same column by default

As of EF6 it is possible to do something like this when configuring Entity mappings using Table Per Hierarchy inheritance:

public class MyContext : DbContext 
{
    public DbSet<Device> Devices { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ABatteryPoweredDevice>().Property(c => c.BatteryLevel).HasColumnName("BatteryLevel");
        modelBuilder.Entity<ADifferentBatteryPoweredDevice>().Property(c => c.BatteryLevel).HasColumnName("BatteryLevel");
    }
}

BatteryLevel is not part of the Device base class- it is a property of the derived classes implemented to fulfill an interface contract.

Is it possible to make this the default behavior as opposed to having to add a new mapping for each derived class?

like image 452
joelmdev Avatar asked Oct 24 '13 21:10

joelmdev


1 Answers

Used Custom Code First Conventions, which are available from EF6 onwards, to sort this out:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //your code before
        modelBuilder.Properties().Configure(prop => prop.HasColumnName(prop.ClrPropertyInfo.Name));
        //your code after
    }

This maps properties with the same name in different derived types to the same table column without explicit calls like those mentioned in the question.

like image 75
joelmdev Avatar answered Oct 15 '22 23:10

joelmdev