我有一个大致如下线的模型:
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()
因为它是一个组可以有许多表达式组件(基本类型)的情况,但是向后没有有意义的导航属性。
这导致每个组件上都有一个列来跟踪它属于哪个组,当我添加一个引用现有表达式的新组时,引用它的前一个组会丢失该引用,而新的组会接管。
我需要能够让多个组引用相同的表达式(或组),但是从表达式转到组没有领域原因。
解决这个问题的正确方法是否只是针对表达式引入一个集合导航属性以链接到它所属的组(/ s)?
还是有一些奇怪的许多<->我需要引入许多变化?
下面是这些类型的实体配置。
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();
}
值得注意的是,还有另一种类型需要引用许多组(只是组),但再一次,不需要反过来。