我想映射两个不同的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 {...}')来限制查询结果中的字段数量。 –