2010-06-02 90 views
2

我想了解實體框架,我有一表「用戶」和一張桌子「的頁面」。這些與聯結表「UserPages」具有多對多關係。首先,我想知道是否使用多對多來正確設計這種關係:一個用戶可以訪問多個頁面,每個頁面都可以被多個用戶訪問...,所以我正確使用many2many?瞭解多對多關係和Entity Framework

第二,更重要的是,我已經明白M2M的關係,用戶和頁表不應該重複信息。即每個用戶和每個頁面應該只有一條記錄。但是,在實體框架中,我如何能夠爲同一用戶的同一頁面添加新的訪問?也就是說,我想我可以簡單地使用由LINQ查詢返回的IEnumerable上的Count()方法來獲取用戶訪問特定頁面的次數。

但我看不出這樣做的方式。在Linq to Sql中,我可以訪問聯結表並在其中添加記錄,以反映特定用戶對特定頁面的訪問次數,儘可能多次。但在EF中,我無法訪問聯結表。我只能從用戶轉到網頁集合,反之亦然。

我敢肯定,我誤解關係什麼的,但我只是無法弄清楚如何建模。我總是可以在頁表中的計數列,但據我明白你不應該設計這樣的數據庫表,這些值應該由查詢收集...

請幫助我瞭解什麼我做錯了......

回答

4

你這樣做是正確

在實體數據模型(EDM)許多一對多關係可以根據它是否包含一些附加字段表示使用或不使用連接表。請參閱下面的文章瞭解更多詳情。


在你的情況下,用戶實體將直接引用集合頁實體,反之亦然,因爲你的模型不包括爲User_Page連接表的映射。

爲了考察添加到特定的頁面上你可以例如用戶做這樣的事情:

using (var context = new YourEntityModelObjectContext()) 
{ 
    var page = context.Pages.FirstOrDefault(p => p.Url == "http://someurl"); 
    var user = context.Users.FirstOrDefault(u => u.Username == "someuser"); 

    user.Pages.Add(page); 

    context.SaveChanges(); 
} 

或者你可以從關係的另一邊做:

using (var context = new YourEntityModelObjectContext()) 
{ 
    var page = context.Pages.FirstOrDefault(p => p.Url == "http://someurl"); 
    var user = context.Users.FirstOrDefault(u => u.Username == "someuser"); 

    page.Users.Add(user); 

    context.SaveChanges(); 
} 

在這兩種情況下,新記錄都將添加到User_Page連接表中。

如果您需要檢索由特定用戶訪問頁面數,你可以簡單地做:

using (var context = new YourEntityModelObjectContext()) 
{ 
    var user = context.Users.FirstOrDefault(u => u.Username == "someuser"); 
    var visitCount = user.Pages.Count; 
} 

相關資源:

+0

謝謝,但除非我以某種方式誤解了你,這不起作用,我已經試過了。我得到這個異常:「無法更新EntitySet'UserPages',因爲它具有DefiningQuery,並且元素中不存在元素以支持當前操作。」我不太清楚這意味着什麼,因爲我對EF很新穎...... – Anders 2010-06-02 20:21:44

+0

聽起來像「UserPages」實體映射到「User」和「Page」表之間的連接表。您不需要在模型中包含該實體,而是在「用戶」和「頁面」實體之間創建一個直接的多對多關係。看看這篇文章的更多細節如何做到這一點:http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ – 2010-06-03 08:09:49

+0

嗯,不存在' t模型中的連接表,只有用戶和頁面類。所以UserPages表似乎只能在背景中使用。當我在對話框中創建實體數據模型時,我確實選擇了所有表格,但是我猜想如果我沒有這樣做,關係將不會包含在模型中?但是,即使我選擇了所有表格,連接表格也不包含在生成的模型中... – Anders 2010-06-03 12:49:35

相關問題