实体框架核心1.1中与同一实体类型的两个一对一关系

时间:2017-01-20 11:01:21

标签: c# entity-framework orm entity-framework-core one-to-one

我们有一个通用的标记系统,它将一种形式的双向标记用于绑定实体(认为客户可以用一个字母标记,并且该字母也会将标记返回给客户)。这意味着一旦我们标记"单向",我们也标记"另一种方式"。这两个标记存储在 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中的外键一样可以解决这个问题。

有人可以帮助我在这里继续前进吗?

0 个答案:

没有答案