我们有一个通用的标记系统,它将一种形式的双向标记用于绑定实体(认为客户可以用一个字母标记,并且该字母也会将标记返回给客户)。这意味着一旦我们标记"单向",我们也标记"另一种方式"。这两个标记存储在 EntityConnection 中 - 因此表/实体有两个连接到同一 EntityTag 表/实体 - SideA 和 SideB 。
这些实体存在于不同的微服务和数据库中,因此我们无法在不同类型的实体之间建立直接的EF关系 - 因此这种通用解决方案。
关系由以下两个类表示:
public class EntityConnection : EntityBase
{
public Guid SideBId { get; set; }
public Guid SideAId { get; set; }
public EntityTag SideA { get; set; }
public EntityTag SideB { get; set; }
}
public class EntityTag : EntityBase
{
public virtual EntityConnection ParentConnection { get; set; }
public Guid ParentConnectionId { get; set; }
public Guid EntityId { get; set; }
public string Type { get; set; }
public string DisplayTitle { get; set; }
public EntityTag GetOtherSide()
{
if (ParentConnection.SideA.Id != EntityId)
{
// Side A is other side - return it
return ParentConnection.SideA;
}
else
{
return ParentConnection.SideB;
}
}
}
关系在DbContext中建模,如下所示:
private void Configure(EntityTypeBuilder<EntityTag> obj)
{
obj.HasIndex(x => new {x.Type, x.EntityId});
}
private void Configure(EntityTypeBuilder<EntityConnection> obj)
{
obj.HasOne(x => x.SideA)
.WithOne(x => x.ParentConnection)
.HasForeignKey<EntityConnection>(x => x.SideAId).IsRequired()
.OnDelete(DeleteBehavior.Cascade);
obj.HasOne(x => x.SideB)
.WithOne(x => x.ParentConnection)
.HasForeignKey<EntityConnection>(x => x.SideBId).IsRequired()
.OnDelete(DeleteBehavior.Cascade);
}
}
当我尝试添加迁移时,收到以下错误消息:
无法在&#39; EntityTag.ParentConnection&#39;之间创建关系。和&#39; EntityConnection.SideB&#39;,因为在&#39; EntityTag.ParentConnection&#39;之间存在关系。和&#39; EntityConnection.SideA&#39;。导航属性只能参与一个关系。
现在,我理解错误消息(我认为)。但它对我没有意义。每个EntityTag只会通过它的ParentConnection属性连接到一个EntityConnection,我认为指定像DbContext中的外键一样可以解决这个问题。
有人可以帮助我在这里继续前进吗?