2013-03-29 20 views
1

我剛剛在一個ASP.NET項目中開始使用實體框架(我最近剛剛開始工作,所以最近我有點不知所措)實體框架將Pure Junction查找錶轉換爲多對多關係

我有一個有4個查找表的數據庫。當我將ADO.Net實體添加到我的asp.net項目時,我最初困惑的是爲什麼我的查找表不見了。做一些看後,我偶然發現了這一點:

Entity Framework lookup table

,並實現了與任何其他列的是查找表,但外鍵變成多對多的關係。這一切都很好。我可能會在這裏錯過一些簡單的東西,我恐怕可能是這樣,但現在我迷失在如何查詢原本沒有問題遍歷查找表的數據。

這裏是我的數據庫的通用模型(不是EDM)

人: PID

組: GID

要求: RID

操作: AID

人/組: PID GID

組/要求: GID RID

要求/行動: RID AID

人/行動: PID AID

所以現在的很多人Person,Group,Requirement和Action之間的許多關係 我不確定如何在我的ASP.Net web表單中構建語句opject代碼遍歷像我以前用查找表一樣的關係。

我以前能夠查詢PID =「所需人員ID」的人員/組,然後使用GID從組/需求中查找所有RID。然後使用RID從Requirement/Action中查找所有的AID。然後將這些AID與AID匹配的所有AID的Person/Action進行比較,以檢查是否滿足要求。

如果你告訴我這是我忽略的ASP.NET基本功能,我不會受到侮辱,但我想如果我在這裏問過,那麼回答是至少會有一個簡潔的答案, SQL查詢到實體框架。

回答

1

在EntityFramework中,您可以選擇添加所謂的'導航屬性'。例如,讓我們看一下假設的Person類中的這些代碼片段。

1:1或1:許多或1:1:從1個透視

public class Person 
{ 
    public virtual Group Group {get;set;} 
} 

許多許多從許多角度

public class Person 
{ 
    public virtual ICollection<Group> Groups {get;set;} 
} 

在多對多關係的情況下的許多,您可以使用EntityFramework FluentAPI來設置Person和Group類之間的關係。對於1對1或1對許多你可以使用FluentAPI,DataAnnotations或讓EntityFramework猜測(我相信它猜測PropertyName_ID)。

在財產申報的virtual意味着我允許的EntityFramework到延遲加載集合當我真正使用它,而不是當我查詢的上下文。你可以聲明一個沒有virtual關鍵字的導航屬性,但是你不能懶加載它。

希望這可以幫助您瞭解導航您的實體。我粗略地列出了一些術語,我認爲您應該通過谷歌幫助進一步瞭解EntityFramework的運作方式。

從你獲得由團所需的所有操作爲特定人的問題:

var requiredActions = myPerson.Groups.SelectMany(x => x.Requirements).SelectMany(x => x.Actions); 

一個人執行的操作是:

var performedActions = myPerson.Actions; 

這兩行假設你已經設置了適當的導航屬性。

+0

我認爲OP首先是關於數據庫的。 –

1

每當你得到一個Person對象時,你將擁有Actions和Groups的屬性。

組也應具有Requirement屬性。

所以我認爲你要尋找的是一樣的東西

list<int> personIds = {1,2,3}; 
List<Requirement> requirements = dbContext.Groups.Where(x => x.Person.Count(y => personIds.Contains(y.PersonId) > 0).Select(x => x.Requirements); 
List<Action> actions = requirements.Actions; 

您也許能弄完是一種巧妙方式,在多對多的關係船舶上總有種痛苦,當我也在EF工作。

0

如前所述,通過多對多關聯,您可以在實體中找到集合屬性。 PersonGroupsGroup將有Persons

如果你做出這樣

db.Persons.Where(p => p.PID == 1).SelectMany(p => p.Groups) 

查詢您將獲得1 Person EF各組建立的是加入Person/Group結表兩次查詢。

綜合(或稱「查詢」)語法可能更適合你:

from p in db.Persons 
from g in p.Groups 
where p.PID == 1 
select g 

現在,你的情況可能可以通過查詢像這樣的解決:

from p in db.Persons 
from g in p.Groups 
from r in g.Requirements 
from ra in r.Actions 
from pa in p.Actions 
where p.PID == 1 
where ra.AID == pa.AID 
select new { <properties from entities above> } 

,但我不能真的從你的問題中得知。這應該可以幫助你獲得它的要點。