我的模型大致如下:
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>
我需要能够有多个组引用同一个表达式(或多个组),但是从表达式到一个组没有域上的原因。
解决这个问题的正确方法仅仅是针对该表达式引入一个集合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();
}
值得注意的是,还有另一种类型需要引用许多组(只是组),但是再次,不需要反向。