我不确定我的标题是否准确描述了我正在尝试做的事情。
我的实体框架中有两个表,个人和用户。我正在尝试显示一个用户网格,所以我设置了这个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?
答案 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; }
}