2016-03-07 57 views
3

實體框架在我的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

Result in DB

正如你所看到的,EF甚至壽我指定的主密鑰和數據註釋外鍵增加了兩個外鍵在AccountCompanyRoles。

問題

  1. 如何防止它從創建AccountCompany_AccountID和AccountCompany_CompanyID?

  2. 這是我以後的最佳結構嗎?我是否應該使用一個主鍵並將IsUnique索引放在AccountID和CompanyID上?這可能會解決我的問題..

回答

1

您的這樣流暢關係到指定的外鍵:

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

+0

太慢....... – Indregaard

+0

我仍然在AccountCompanyRole表中獲得兩個額外的列。我甚至刪除了DB/Migrations並重新創建了我的數據庫,但這也沒有幫助。 – Reft

+0

嘗試爲您的AccountCompany關係添加流暢的配置以及(請參閱更新的答案) – Indregaard

3

如何防止它從創建AccountCompany_AccountID和AccountCompany_CompanyID?

首先,從CompanyIDRoleID除去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都是有效的方法,使用更適合您的需求。

+0

嗨流利的配置!我試着用Data Annoitations和Fluent API提出你的建議,並且我的AccountCompanyRole表中仍然有兩個額外的列。我甚至刪除了數據庫/遷移並重新創建了我的數據庫,但這也沒有幫助。 – Reft

+0

不得不爲AccountCompany添加流暢的配置。不過,我向你提出了這樣一個詳細的答案。謝謝 – Reft

+0

@Reft不客氣。很高興你的問題已經解決了。然而「解決方案」聞起來。兩次配置一個相同的關係是沒有意義的。我在EF環境中檢查過它,問題是'WithMany()'調用,它應該和更新後的答案一樣。 –