一列具有多个表的外键inf EntityFramework Core

问题描述 投票:0回答:1

是否可以在 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 的表具有:

  • TransitionEntity.TableType = TableTypes.A 然后使用关系 TransitionEntity.TableTypeId == EntityA.Id.Value
  • 当 TransitionEntity.TableType = TableTypes.A 时,使用关系 TransitionEntity.TableTypeId == EntityB.Id.Value

我希望建立一对一的关系。我尝试使用 TPH 层次结构方法,但没有成功。在 EF Core 中是否可能?

.net entity-framework .net-core domain-driven-design
1个回答
0
投票

对于所有其他人,我已经弄清楚了这一点并且这是可能的。使用TPH是关键。

  1. 创建适当的继承:
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;}
}
  1. 配置 TransitionEntity Fluent 构建器
        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)
  1. 使用 Fluent api 配置适当的覆盖。
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");

 }
  1. 使用 Fluent api 配置 EntityA 和 EntityB。
  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 不同的值。因此,我认为覆盖作为鉴别器的列中的所有现有值非常重要。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.