带有多对多集合的EF Core 2.1区分类型

时间:2018-07-17 22:19:40

标签: c# entity-framework-core tph entity-framework-core-2.1

我的模型大致如下:

Expression
ExpressionGroup
  - Expressions (Polymorphic collection via base type that is Either Expression or ExpressionGroup)
  ^ Achieved by means of a base class that is configured with a discriminator column (Type enum)

我正在使用的系统需要以下条件:

  • 表达式和组是唯一可识别的,并且应该是共享的对象(例如,多个组可以引用相同的表达式,并且可以引用相同的组)

我使用HasMany(group => group.Expressions).WithOne()配置进行了此配置,因为这种情况下,一个组可以具有许多表达式组件(基本类型),但是没有向后的有意义的导航属性。

这将导致每个组件上的一列跟踪其所属的组,并且当我添加引用现有表达式的新组时,引用它的上一个组将丢失该引用,而新的组将接管。 / p>

Resulting SQL Structure & Values

我需要能够有多个组引用同一个表达式(或多个组),但是从表达式到一个组没有域上的原因。

解决这个问题的正确方法仅仅是针对该表达式引入一个集合nav属性以链接到它所属的组吗?

还是有些怪异的<->我需要引入很多变化?


以下是这些类型的实体配置。

void IEntityTypeConfiguration<BA.MetaBlockExpressionBase>.Configure(EntityTypeBuilder<BA.MetaBlockExpressionBase> builder)
{
    builder.ToTable("ExpressionComponents");

    builder.HasDiscriminator(e => e.Type)
        .HasValue<BA.MetaBlockExpression>(DTO.Topics.Blocks.MetaBlockExpressionType.Expression)
        .HasValue<BA.MetaBlockExpressionGroup>(DTO.Topics.Blocks.MetaBlockExpressionType.Group);

    builder.Property(e => e.Token)
        .IsRequired();

    builder.Property(e => e.Type)
        .IsRequired();

    builder.HasIndex(e => e.Token)
        .IsUnique(true);
}

void IEntityTypeConfiguration<BA.MetaBlockExpression>.Configure(EntityTypeBuilder<BA.MetaBlockExpression> builder)
{
    builder.Property(e => e.FacetId)
        .IsRequired();

    builder.Property(e => e.Operation)
        .IsRequired();

    builder.Property(e => e.Values)
        .IsRequired()
        .HasConversion(
            vals => CSVUtilities.ToCsvStringList(vals),
            str => CSVUtilities.FromCsvStringList(str).ToArray());
}

void IEntityTypeConfiguration<BA.MetaBlockExpressionGroup>.Configure(EntityTypeBuilder<BA.MetaBlockExpressionGroup> builder)
{
    builder.Property(g => g.Operator)
        .IsRequired();

    builder
        .HasMany(g => g.Expressions)
        .WithOne();
}

值得注意的是,还有另一种类型需要引用许多组(只是组),但是再次,不需要反向。

0 个答案:

没有答案