![](/img/trans.png)
[英]Can I create a bidirectional foreign key relationship using Entity Framework Code First data annotations?
[英]Entity Framework - Code first - Data annotations - Unnecessary foreign key columns
實體框架在我的AccountCompanyRole表中創建了兩個不必要的列。
AccountCompany
public class AccountCompany
{
[Key, Column(Order = 0), ForeignKey("Account")]
public int AccountID { get; set; }
[Key, Column(Order = 1), ForeignKey("Company")]
public int CompanyID { get; set; }
public virtual Account Account { get; set; }
public virtual Company Company { get; set; }
public virtual ICollection<AccountCompanyRole> AccountCompanyRoles { get; set; }
}
AccountCompanyRoles
public class AccountCompanyRole
{
[Key, Column(Order = 0), ForeignKey("AccountCompany")]
public int AccountID { get; set; }
[Key, Column(Order = 1), ForeignKey("AccountCompany")]
public int CompanyID { get; set; }
[Key, Column(Order = 2), ForeignKey("Role")]
public int RoleID { get; set; }
public virtual AccountCompany AccountCompany { get; set; }
public virtual Role Role { get; set; }
}
OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AccountCompanyRole>()
.HasRequired(p => p.AccountCompany)
.WithMany()
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
DB中的結果
如您所見,EF在AccountCompanyRoles中添加了兩個額外的外鍵,即使我在Data Annotations中指定了主鍵和外鍵。
問題
如何阻止它創建AccountCompany_AccountID和AccountCompany_CompanyID?
這是我追求的最佳結構嗎? 我應該使用一個主鍵並將IsUnique索引放在AccountID和CompanyID上嗎? 這可能會解決我的問題..
如何阻止它創建AccountCompany_AccountID和AccountCompany_CompanyID?
首先,從CompanyID
和RoleID
刪除ForeignKey
屬性。
然后將ForeignKey
屬性放在AccountCompany
成員上,如下所示:
public class AccountCompanyRole
{
[Key, Column(Order = 0)]
public int AccountID { get; set; }
[Key, Column(Order = 1)]
public int CompanyID { get; set; }
[Key, Column(Order = 2), ForeignKey("Role")]
public int RoleID { get; set; }
[ForeignKey("AccountID, CompanyID")]
public virtual AccountCompany AccountCompany { get; set; }
public virtual Role Role { get; set; }
}
或者像這樣使用流暢的配置:
modelBuilder.Entity<AccountCompanyRole>()
.HasRequired(r => r.AccountCompany)
.WithMany(c => c.AccountCompanyRoles)
.HasForeignKey(r => new { r.AccountID, r.CompanyID })
.WillCascadeOnDelete(false);
這是我追求的最佳結構嗎? 我應該使用一個主鍵並將IsUnique索引放在AccountID和CompanyID上嗎? 這可能會解決我的問題..
IMO都是有效的方法,使用最適合您需求的方法。
您必須在流暢的關系中指定外鍵,如下所示:
modelBuilder.Entity<AccountCompanyRole>()
.HasRequired(p => p.AccountCompany)
.WithMany().HasForeignKey(d => new { d.AccountID, d.CompanyID })
.WillCascadeOnDelete(false);
modelBuilder.Entity<AccountCompany>()
.HasMany(c => c.AccountCompanyRoles)
.WithRequired(d => d.AccountCompany)
.HasForeignKey(e => new {e.AccountID, e.CompanyID});
編輯:為AccountCompany添加了流暢的配置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.