【问题标题】:Entity Framework Core: Multiple Relationships between Users and OrganizationsEntity Framework Core:用户和组织之间的多重关系
【发布时间】:2017-09-08 20:21:35
【问题描述】:

我有 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);

我在迁移时出错:

无法在“User.org”和 'OrgList.ownerUser',因为两者之间已经存在关系 “OrgList.employees”和“User.org”。导航属性只能 参与单一关系。

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

我可以在不为员工创建额外的表或不在用户类上创建额外的virtual OrgList 的情况下做到这一点吗?

【问题讨论】:

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


    【解决方案1】:

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

    public int? OwnedOrganizationID { get; set; }
    public virtual OrgList OwnedOrg { get; set; }
    

    并将语句更改为

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

    我想它应该可以工作。

    【讨论】:

    • 我知道这件事。但在我的示例中,设计上只有两种可能的情况:1)用户是同一组织的员工和所有者 2)用户是某个组织的员工,但不是任何组织的所有者。如果用户拥有一个组织,则属性 OwnedOrganizationId 链接到与 OrganizationId 相同的组织。所以我猜可能只有一种关系。但无论如何,这是一个 EF 设计(或我的想法)问题,所以我会接受你对其他一般情况的回答。
    • 你会使用像entity.HasOne(e.ownerUser).WithOne().HasForeignKey&lt;OrgList&gt;(e =&gt; e.ownerId);这样的无导航关系,这样Org就知道谁是导航的所有者。要检查用户是否是所有者,请检查user.OrgList.ownerUser == user
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    相关资源
    最近更新 更多