實體框架6和TPH繼承:默認情況下,將具有相同名稱的屬性映射到同一列

.net entity-framework-6 table-per-hierarchy

從EF6開始,在使用Table Per Hierarchy繼承配置實體映射時,可以執行類似的操作:

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不是Device基類的一部分 - 它是為實現接口契約而實現的派生類的屬性。

是否可以將此作為默認行為,而不是必須為每個派生類添加新映射?

一般承認的答案

使用自定義代碼優先約定 (可從EF6開始提供)對此進行排序:

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

這會將不同派生類型中具有相同名稱的屬性映射到同一個表列,而不會顯示問題中提到的顯式調用。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因