2013-06-05 84 views
0

我不確定我的標題是否準確地描述了我正在嘗試執行的操作。EntityDataSource訪問GridView中另一個實體的集合

我在我的實體框架,人員和用戶有兩個表。我想顯示用戶的網格,所以我成立了這個EntityDatasource:

<asp:EntityDataSource ID="peopleQuery" runat="server" 
    ConnectionString="name=myEntities" DefaultContainerName="myEntities" 
    EnableFlattening="False" EntitySetName="people" Include="location" 
    Where="it.active = 1" OrderBy="it.lastname, it.firstname">  
</asp:EntityDataSource> 
在我的GridView

現在,我可以綁定到像姓氏,名字,EMAILADDRESS領域,領域從類似地址的位置表市。

現在,在我的系統中,用戶記錄可以附加到一個或多個人員記錄。所以這是一對多的關係。在gridview中,我想顯示與每個人相關的用戶。我可以用RowDataBound事件來做到這一點,但是這需要爲數據庫中的每一行額外查找數據庫。

是否有一種有效的方法從「一對多」外鍵關係的「多」端導航?

實際上,它甚至不一定是一對多的。它可能是1比1,但是你處於外鍵關係的另一端。所以,在這個例子中,EntityDataSource使用「person」表,但在用戶表中,我有一個personid字段。所以外鍵是user.personid => person.personid。由於GridView是從用戶人員表中驅動的,因此如何導航到用戶表以在我的GridView中顯示user.username?

回答

1

可以嵌套或者你的GridView內一個gridview或中繼器和使用的關係由數據源設置的關係來填充數據:

<asp:EntityDataSource ID="eds" runat="server" 
    ContextTypeName="people" 
    EnableFlattening="False" 
    EntitySetName="people" 
    Include="users" >  
</asp:EntityDataSource>  

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="PeopleId" DataSourceID="eds"> 
    <Columns>    
     <asp:BoundField DataField="FirstName" HeaderText="First name" /> 
     <asp:BoundField DataField="LastName" HeaderText="Last name" /> 
     <asp:TemplateField HeaderText="People"> 
      <ItemTemplate> 
      <asp:Repeater ID="rptUsers" runat="server" DataSource='<%# Eval("users") %>'> 
        <ItemTemplate> 
         <%# Eval("username") %> 
        </ItemTemplate> 
      </asp:Repeater> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

這裏假設你在你的數據模型有關係的設置,例如:

public class person(){ 
    public int PersonId{get;set;} 
    public string FirstName{ get;set;} 
    public string LastName{ get;set;} 
    pubic virtual ICollection<user> users { get; set; } 
} 

public class user(){ 
    public int UserId{ get;set;} 
    public string username{ get;set; } 
} 
+0

我看到你在那裏做什麼,如果有一個人稱爲用戶的集合,這將工作。它沒有。用戶記錄具有字段personid,使得一個或多個用戶可以與一個人相關聯。 (例如:約翰史密斯可能有一個管理登錄和transactonal登錄。) – RMS2

+0

所以基本上,使用上面的代碼,我需要將TemplateField的DataSource設置爲類似[僞代碼]'select * from user where personid = Eval(「personid」)',但我認爲這需要查詢N + 1次的數據庫。 – RMS2

+0

第二次看,你的回答是對的錢,我確實有我的數據模型中建立的關係。我將你的代碼添加到了我的GridView中,我沒有收到任何錯誤,但它也不顯示用戶名。不知道爲什麼 - 肯定有一個名爲「用戶」的集合,並且該集合中的每個項目都有一個名爲「用戶名」的屬性。有任何想法嗎?我們缺少什麼?順便說一句,如果我將「用戶」更改爲「用戶1」,則會出現錯誤。但是,如果我將「用戶名」更改爲「用戶名1」,我不會收到錯誤,但它仍然不會顯示任何內容。 – RMS2

相關問題