0

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

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

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

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

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

4

1 回答 1

1

您可以在 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; }
}
于 2013-06-05T21:00:44.277 回答