是否可以在 EF Core 中建模这种关系?
class EntityA
{
public EntityAId Id {get;set;}
public string Name {get;set;}
}
class EntityB
{
public EntityBId Id {get;set;}
public string Name {get;set;}
}
enum TableTypes {A,B}
class TransitionEntity
{
public int Id {get;set;}
public string TransitionName {get;set;}
public TableTypes TableType {get;set;}
public TableTypeId int {get;set;}
}
EntityAId 和 EntityBId 是强类型实体标识符。
这个想法是当包含 TransitionEntity 的表具有:
我希望建立一对一的关系。我尝试使用 TPH 层次结构方法,但没有成功。在 EF Core 中是否可能?
对于所有其他人,我已经弄清楚了这一点并且这是可能的。使用TPH是关键。
abstract class TransitionEntity
{
public int Id {get;set;}
public string TransitionName {get;set;}
public TableTypes TableType {get;set;}
}
class TransitionEntityA:TransitionEntity
{
public EntityAId EntityAId {get;set;}
}
class TransitionEntityB:TransitionEntity
{
public EntityBId EntityBId {get;set;}
}
public void Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder<TransitionEntity> builder)
{
builder.HasKey(b => b.Id);
builder.Property(b => b.Id)
//other props
builder.HasDiscriminator<TableTypes >("TableType")
.HasValue<TransitionEntityA>(TableTypes.A)
.HasValue<TransitionEntityN>(TableTypes.B)
Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder<TransitionEntityA> builder)
{
builder.Property(d => d.TableTypeId ).HasColumnName("TableTypeId");
}
Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder<TransitionEntityB> builder)
{
builder.Property(d => d.TableTypeId ).HasColumnName("TableTypeId");
}
public void Configure(EntityTypeBuilder<EntityA > builder)
{
builder.HasKey(b => b.Id);
builder.Property<EntityAId>("Id")
.HasConversion(id => id.Value, value => new EntityAId(value))
//other props
//you can extend class to use navigation, then use it like this
builder.HasOne(b => b.TransitionEntityA)
.WithOne(p => p.TransitionEntity)
.HasForeignKey<TransitionEntityA>(p => p.EntityAId );
以与EntityA相同的方式配置EntityB。这种方法最初不起作用,因为我在 TransitionEntity 表的实际列 TableType 中具有与 TableType.A 和 TableType.B 不同的值。因此,我认为覆盖作为鉴别器的列中的所有现有值非常重要。
希望有帮助。