2011-07-09 85 views
1

我有3個表:實體框架多對多的關係問題

-Users (UserId(pk), Email, Password) 
-Roles (RoleId(pk), RoleDescription) 
-UsersInRole (UserId(pk), RoleId(pk)) 

我定義的關係用戶 - > UsersInRole和Roles-> UsersInRole在DB。當我在Visual Studio中創建edmx文件時,它只顯示兩個類:通過多對多關係連接的用戶和角色(UsersInRole表不顯示爲我猜測的類,因爲該表在那裏將多個很多數據庫問題)。

現在,我試圖定義一個給定角色的方法,它應該返回一個用戶列表。這是行不通的:

public List<User> usersPerRole(string role) 
    { 
     return from u in entities.Roles where u.RoleID == role select u.Users.ToList(); 
    } 

任何人都可以給我一個正確的方法來做到這一點的例子嗎?

感謝,

回答

1

一個耦合表「UsersInRole」(沒有任何兩個外鍵一起構成表的主鍵)將被翻譯導入外鍵「雙方」的導航屬性。所以在用戶和角色實體中。在用戶中它將是User.RolesForThisUser,在角色中它將是Role.UsersWithThisRole。在耦合表中添加任何互補列將導致該表的特定實體,並導致導航屬性損失。

現在對於你的問題宥可以SimPy中做到:

public List<User> usersPerRole(string role) 
{ 
using(Entities context is new Entities()) 
{ 
    return context.Role.FirstOrDefault<Role>(r => r.ID == role).Include("UsersInRole") 
} 
} 
+0

這兩個答案都是有效的,不幸的是我只能標記一個是正確的,如果有任何人有這個問題,你可以用這些替代品去。 – webyacusa

+0

@webyacusa:謝謝! @拉迪斯拉夫:榮譽讓我的回答在臭名昭着的EF大師Ladislav Mrinka的回答之上「首選」;) –

1

你需要的東西像這樣(我希望你有Users導航屬性上Role實體):

public List<User> UsersPerRole(string role) 
{ 
    return entities.Roles 
        .Where(r => r.RoleId == role) 
        .SelectMany(r => r.Users) 
        .ToList(); 
} 

你可以重寫相同的無lambda表達式:

public List<User> UsersPerRole(string role) 
{ 
    return (from r in entities.Roles 
      from u in r.Users 
      where r.RoleId == role 
      select u).ToList(); 
}