2012-06-06 43 views
12

我最近遇到了Entity Framework Code First這個奇怪的問題。爲什麼我使用實體框架代碼第一外鍵屬性獲取額外的外鍵列?

我的類看起來像這樣

public class Status 
{ 
     [Key] 
     public int StatusID { get; set; }  
     public string Name { get; set; } 
     public int MemberID { get; set; } 

     [ForeignKey("MemberID")] 
     public virtual Member Member { get; set; }     

     public int PosterID { get; set; } 

     [ForeignKey("PosterID")] 
     public virtual Member Poster { get; set; }   

     public virtual ICollection<StatusLike> StatusLikes { get; set; }   
     public virtual ICollection<StatusComment> StatusComments { get; set; } 
} 

我的會員類看起來像這樣

public class Member 
    { 
     [Key] 
     public int MemberID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Bio { get; set; } 

     public virtual ICollection<MemberCourseTaken> MemberCourseTakens { get; set; } 
     public virtual ICollection<Status> Statuses { get; set; } 
     public virtual ICollection<Club> FoundedClubs { get; set; } 

     public string EmailAddress { get; set; } 
     public string Password { get; set; } 
     public string Phone { get; set; } 

     public int AccountSourceID { get; set; } 
     public AccountSource AccountSource { get; set; } 

     public int AddressID { get; set; } 
     public Address Address { get; set; } 
     public string ProfilePhoto { get; set; } 

     public int MemberRankID { get; set; } 
     public MemberRank MemberRank { get; set; } 
     public DateTime Created { get; set; } 
     public DateTime Modified { get; set; } 
    } 

而且無論出於何種原因所創建的數據庫表有以下幾列

StatusID 
Name 
MemberID 
PosterID 
Member_MemberID 

MemberIDPosterIDMember_MemberID是外鍵。

我該如何保持Member_MemberID不被生成?

+1

你有多少個從'Member'到'Status'的導航屬性?顯示你的'成員'級。 –

+0

很多!我在成員類中添加了這個問題。 –

回答

8

您的Member_MemberID列是由於Member.Statuses屬性而創建的。我可以想象這不是你想要的。可能的成員和狀態應該彼此獨立存在,所以你需要一個聯結表。

我不知道,如果你已經使用OnModelCreating覆蓋了的DbContext的,但是這改變會員和狀態之間的映射的地方:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<Member>().HasMany(m => m.Statuses).WithMany(); 
} 

這將創建一個表MemberStatuses表與兩個Id列作爲外鍵。這是在關聯「另一側」沒有導航屬性的情況下建立多對多關係的一種方法。 (我不認爲你想在StatusMembers財產)。

+3

這裏有更多的解釋是很好的。我真的不明白爲什麼2對多關係應該導致創建'Member_MemberID'列。爲什麼需要? – Jez

+1

@Jez你是對的,它可以解釋得更好一點。 'Member_MemberID'字段是一對多關係成員狀態的狀態FK。它被創建是因爲該關聯不被視爲「成員」或「海報」的雙向部分。我的解決方案的重點是(imo)成員和狀態是完全獨立的實體,並不像順序排序一樣。 –

+0

我真的很難理解你在說什麼,@GertArnold。什麼是「協會」?什麼是「雙向部分」? – Jez

0

我以前見過這個。在我的情況(使用EF 6.1),那是因爲我流利的API映射成立像這樣:

// In my EntityTypeConfiguration<Status> 
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID); 

該代碼工作完全正常,但它並沒有告訴EF我Member類的集合導航屬性Status ha被考慮在內。因此,雖然我明確處理了Status類中Member導航屬性的存在,但現在我離開了一個孤立的相關集合屬性。這個孤兒財產,作爲一個集合,告訴EF我的Status類需要有一個外鍵。所以它創建了Status類。

要解決它,我必須100%明確。

HasRequired(x => x.Member).WithMany(x => x.Statuses).HasForeignKey(x => x.MemberID) 

這可能是蜜蜂在MemberStatuses集合屬性需要告訴它,它已經被認爲是,而不是去自動創建映射的屬性。我不知道那個屬性。