如何在 ASP.Net MVC 5 - Fluent API 中处理多对多相同的 table(用户)

How to handle many to many same table (User) in ASP.Net MVC 5 - Fluent API

我正在学习 ASP.Net MVC 5,并且我坚持使用一种基本的数据库设计。 所以,我有一个用户可以推荐很多人工作 此外,许多人可以申请让自己被推荐。我创建了两个角色,所有这些都得到了照顾。现在,我在 class 上调用了 Referral,它将跟踪需要完成的每个 Referral 实例。

推荐模型:

Public class Referral
{
     [Key]
        public int ReferralId { get; set; }
        public Company Company { get; set; }
        public int CompanyId { get; set; }
        public ApplicationUser User { get; set; }
        public string CandidateId { get; set; } // Application User ID of person asking for referral
        public string ReferrerId { get; set; } // Application user ID of person referring the candidate
}

应用程序用户模型

  public class ApplicationUser : IdentityUser
    {
        public ICollection<Referral> Referrals { get; set; }
        // rest prop removed for brevity sake
    }

现在,假设 A(Referrer) 推荐 B(Candidate)。我的 Table 行如下所示。

ReferralId     CompanyId     CandidateId   ReferrerId

1              1             B             A

到目前为止一切顺利。但我想在 Referral table 上建立 FK 关系。我是 Fluent API 的新手,但我试过如下。

    // one candidate can have many referrals
    dBModelBuilder.Entity<ApplicationUser>()
    .HasMany(u => u.Referrals)
    .WithRequired(u => u.User)
    .HasForeignKey(u => u.CandidateId)
    .WillCascadeOnDelete(false);

    //one referrar can have many referrals
    dBModelBuilder.Entity<ApplicationUser>()
    .HasMany(u => u.Referrals)
    .WithRequired(u => u.User)
    .HasForeignKey(u => u.ReferrerId);

但是EF只尊重一种关系。为什么两个外键关系都没有设置。如果我注释掉一个然后其他作品,反之亦然。但是如图所示将它们放在一起是行不通的。

预期行为:我预计会有两个 FK 关系。一旦我有了它,我就可以相应地工作。请在这里指导我。我对这一切都是陌生的。

正如评论中提到的@SLaks,为了拥有两个关系,你需要两个 havigation属性(每个FK一个).

所以在 one 边用这样的东西替换 Referrals 属性:

public class ApplicationUser : IdentityUser
{
    // ...
    public ICollection<Referral> ReferrerOf { get; set; }
    public ICollection<Referral> CandidateOf { get; set; }
}

at many side replace the User 属性 with:

public class Referral
{
    // ...
    public ApplicationUser Candidate { get; set; }
    public ApplicationUser Referrer { get; set; }
}

并将它们与流利的 API:

相关联
modelBuilder.Entity<ApplicationUser>()
    .HasMany(u => u.CandidateOf) // <--
    .WithRequired(r => r.Candidate) // <--
    .HasForeignKey(r => r.CandidateId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<ApplicationUser>()
    .HasMany(u => u.ReferrerOf) // <--
    .WithRequired(r => r.Referrer) // <--
    .HasForeignKey(r => r.ReferrerId);

只要正确关联,导航属性的名称并不重要。