如何在 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);
只要正确关联,导航属性的名称并不重要。
我正在学习 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);
只要正确关联,导航属性的名称并不重要。