EntityDataSource从GridView中的另一个实体访问集合

时间:2013-06-05 20:24:15

标签: asp.net entity-framework entitydatasource

我不确定我的标题是否准确描述了我正在尝试做的事情。

我的实体框架中有两个表,个人和用户。我正在尝试显示一个用户网格,所以我设置了这个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中,我可以绑定到lastname,firstname,emailaddress等字段,以及地址和城市等位置表中的字段。

现在,在我的系统中,用户记录可以附加到一个或多个人员记录中。所以这是1对多的关系。在gridview中,我想显示与每个人相关联的用户。我可以使用RowDataBound事件来完成它,但这需要对数据库中的每一行进行额外的数据库查找。

是否有一种有效的方法可以从“1对多”外键关系的“多”端导航?

实际上,它甚至不必是1对多。它可能是1比1,但你是外键关系的另一端。因此,在此示例中,EntityDataSource使用“person”表,但在user表中,我有一个personid字段。所以外键是user.personid =&gt; PERSON.PERSONID。由于GridView是从用户人员表驱动的,我如何导航到用户表以在我的GridView中显示user.username?

1 个答案:

答案 0 :(得分:1)

您可以在Gridview中嵌套gridview或repeater,并使用该关系通过将数据源设置为关系来填充数据:

<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; }
}