实体框架核心:用户和组织之间的多重关系

时间:2017-09-08 08:49:29

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

我有2个用户和组织的模型类。

public class User : IdentityUser
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Surname { get; set; }

    public int? OrganizationID { get; set; }

    public virtual OrgList org { get; set; }
}

public class OrgList
{
    public OrgList()
    {
        employees = new HashSet<User>();
    }

    public int id { get; set; }
    public String name { get; set; }
    public String ownerId { get; set; }

    public virtual ICollection<User> employees { get; set; }
    public virtual User ownerUser { get; set; }
}

用户可以是某个组织的所有者,也是同一组织的员工(但其他员工不能成为该组织的所有者)。

首先,我已经为员工建立了一种关系并且运作正常

modelBuilder.Entity<OrgList>(entity =>
{
    entity.HasMany(e => e.employees)
        .WithOne(e => e.org)
        .HasForeignKey(e => e.OrganizationID)
        .OnDelete(DeleteBehavior.SetNull);
}

但是当我尝试为所有者添加另一种关系时

entity.HasOne(e => e.ownerUser)
    .WithOne(e => e.org)
    .HasForeignKey<OrgList>(e => e.ownerId)
    .OnDelete(DeleteBehavior.Cascade);

我在迁移时遇到错误:

  

无法在&#39; User.org&#39;之间建立关系。和   &#39; OrgList.ownerUser&#39;,因为之间已经存在关系   &#39; OrgList.employees&#39;和&#39; User.org&#39;。导航属性只能   参加一个单一的关系。

我该如何解决?我找到了EF6(不是EF Core)的答案,其中包含EF Core中不存在的HasOptional()WithOptionalPrincipal()方法。

我是否可以在不为员工创建额外表格或在用户类上创建其他virtual OrgList的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

您尝试使用您用于员工关系的用户的相同属性创建所有者关系。实体框架不知道分配属性的关系。如果您在用户上创建了另一个属性,如

entity.HasOne(e => e.ownerUser)
.WithOne(e => e.OwnedOrg)
.HasForeignKey<OrgList>(e => e.ownerId)
.OnDelete(DeleteBehavior.Cascade);

并将语句更改为

newObs = combineLatest(
  this.itemObs,
  this.boolObs1
  this.boolObs3,
  (item, bool1, bool2) => ((item || bool1) && bool2) ? item : null
);

我想它应该有用。