我想映射兩個不同的EF模型到同一個表SharedTable,讓我們稱他們爲EntityA和EntityB。我讓它們都擴展了一個名爲BaseEntity的基本實體。EF繼承與表拆分
EntityA僅與SharedTable字段一起定義,EntityB在SharedTable和EntityBTable中具有字段。
modelBuilder.Entity<BaseEntity>()
.Map<EntityA>(m => m.Requires("IsEntityA").HasValue<bool>(true))
.Map<EntityB>(m => m.Requires("IsEntityA").HasValue<false>(true));
modelBuilder.Configurations.Add(new EntityBMap());
modelBuilder.Configurations.Add(new EntityAMap());
modelBuilder.Configurations.Add(new BaseEntityMap());
的模型看起來像這樣
public class BaseEntity
{
[Required]
public int Id { get; set; }
public int SharedTableField1 { get; set; }
}
public class EntityA : BaseEntity
{
public int SharedTableField2 { get; set; }
}
public class EntityB : BaseEntity
{
public int EntityBTableField1 { get; set; }
}
的映射是
public class BaseEntityMap : EntityTypeConfiguration<BaseEntity>
{
public BaseEntityMap()
{
// Primary Key
this.HasKey(t => t.Id);
this.ToTable("SharedTable");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.SharedTableField1).HasColumnName("SharedTableField1");
}
}
public class EntityAMap : EntityTypeConfiguration<EntityA>
{
public EntityAMap()
{
this.HasKey(t => t.Id);
this.Property(t => t.Id).HasColumnName("Id");
this.ToTable("SharedTable");
this.Property(t => t.SharedTableField2).HasColumnName("SharedTableField2");
}
}
public class EntityBMap : EntityTypeConfiguration<EntityB>
{
public EntityBMap()
{
Map(c =>
{
HasKey(t => t.Id);
Property(t => t.Id).HasColumnName("Id");
c.Properties(t => new
{
t.SharedTableField2
});
c.ToTable("SharedTable");
});
Map(c =>
{
c.Properties(t => new
{
t.EntityBTableField1
});
c.ToTable("EntityBTable");
});
}
}
我得到的錯誤說:
'System.NotSupportedException' 類型的第一次機會異常發生在EntityFramework.dll中
附加信息:類型'EntityB'不能按照定義進行映射,因爲它將繼承的屬性映射到使用實體分割或其他形式的繼承的類型。選擇不同的繼承映射策略,以便不映射繼承的屬性,或者更改層次結構中的所有類型以映射繼承的屬性,並且不使用拆分。
任何方法?
爲什麼要將't.EntityBTableField1'映射到另一個表? (這被稱爲*實體分割*)。 –
將它存儲在另一個表中是有意義的,因爲它不會在所有記錄中使用,因此在不需要獲取時會減少檢索的數據量。 – MaPi
這可能是有意義的,如果它是關於大型對象或實際上昂貴的計算域。我不會擔心幾個int或其他小類型。你也可以使用投影('Select(x => new {...}')來限制查詢結果中的字段數量。 –