2011-03-22 153 views
3

我們有遺留的數據庫,我們將新的對象和道具映射到舊的表和列。到現在爲止還挺好。我們有成功映射的多對多關係。中間表格包含額外的數據。當我們嘗試將中間表映射到一個對象時,我們會發現映射已經定義的異常。如果我們從關係的任何一邊刪除映射,那麼我們就會錯誤地發現表缺失(ofc,我們期望這一點)。我可以用NHibernate輕鬆做到這一點,我開始認爲EF缺少真正的許多功能。所以,請告訴我我錯了,我們可以用EF做到這一點。EF CF:與其他信息的多對多關係

問候

編輯:這是一個失敗的虛擬樣品。

class User 
{ 
    public ICollection<User> Followers{get;set;} 
} 

class UserRelation 
{ 
    public User User{get;set;} 
    public User Follower{get;set;} 
    public DateTime CreatedOn{get;set;} 
} 

用戶映射

modelBuilder 
    .Entity<User>() 
    .HasMany<User>(user => user.Followers) 
    .WithMany() 
    .Map(m =>m.MapLeftKey("user_id").MapRightKey("follower_id") 
    .ToTable("user_follower")); 

用戶關係映射

modelBuilder 
    .Entity<UserRelation>() 
    .ToTable("user_follower"); 

modelBuilder 
    .Entity<UserRelation>() 
    .HasOptional<User>(f => f.User) 
    .WithRequired().Map(m => m.MapKey("user_id")); 

modelBuilder 
    .Entity<UserRelation>() 
    .HasOptional<User>(f => f.Follower) 
    .WithRequired().Map(m => m.MapKey("follower_id")); 

modelBuilder 
    .Entity<UserRelation>() 
    .Property(entity => entity.CreatedOn) 
    .HasColumnName("created_on"); 

異常

指定的模式無效。錯誤: (67,6):錯誤0019:已經定義了架構'dbo'和表'user_follower'的EntitySet'UserUser'。每個EntitySet必須引用一個唯一的模式和表。

EDIT2:這裏是這種模式的另一個例子:http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/

+0

我使用EF幾個許多一對多的關係相當成功,或許如果你告訴我們的一些地方比如你煩惱是,我們可以幫助 – 2011-03-22 13:10:05

+0

是的,我意識到和樣品是上漲 – mynkow 2011-03-22 13:54:59

回答

9

僅當聯結表僅包含外鍵時,才能使用直接多對多映射。如果你想在聯合表中公開其他屬性,你必須將它映射到單獨的實體,並從多對多中使用的前實體中映射兩個一對多關係。

我其實不能寫你的代碼,因爲我不明白你的例子。

嘗試僅僅(不映射多到很多用戶):

modelBuilder.Entity<UserRelation> 
    .HasRequired(r => r.User) 
    .WithMany(u => u.Followers); 

modelBuilder.Entity<UserRelation> 
    .HasRequired(r => r.Follower) 
    .WithMany(); 
+0

一個用戶可以有很多用戶。多對多關係不是來自2個表格和聯結表格,而是1個表格和聯結表格。單獨的實體是UserRelation。 – mynkow 2011-03-22 13:43:44

+0

10x,想象一下User類是UserNew。當我在UserNew中刪除地圖時,它告訴我UserNew_id不存在。 :| – mynkow 2011-03-22 14:34:11

+0

修改您的問題並添加您的新代碼映射。 – 2011-03-22 22:56:08

1

EF映射爲相關對象的屬性很多一對多的關係。

所以,假設您有CarsDrivers這是m-to-n相關的。在您的EF模型中,您會看到每個Car對象具有Drivers集合作爲屬性,並且每個Driver對象具有作爲屬性的Cars集合。

這就是在EF中如何建模m對n關係。

+0

我知道很熱,建立關係。我不是在問這個。 – mynkow 2011-03-22 13:13:10

+0

你可能知道如何創建它們,但是我懷疑你理解它們是如何工作的,因爲你試圖建立連接表模型。 – 2011-03-22 13:14:16

+0

10x布萊恩,但我認爲你會走向錯誤的方向。我更新了有關如何嘗試映射模型的詳細信息。 – mynkow 2011-03-22 14:05:17