我有一个名为 Employee 的实体,它有一个名为 Groups 的导航属性。
Groups 映射到具有 Name 属性的 Group 实体。
为了设置关系数据,我实现了这个问题的答案: Columns of two related database tables in one ASP.NET GridView with EntityDataSource
我有一个员工实体,其中还包括他们的组:
<asp:EntityDataSource ID="GroupsByEmployeeSource" runat="server" ConnectionString="name=SafetyContext" DefaultContainerName="SafetyContext" EnableDelete="True" EnableFlattening="False" EnableInsert="True" EnableUpdate="True" EntitySetName="Employees" Include="Groups" Where="it.[EID] == @EmpID">
<WhereParameters>
<asp:ControlParameter Name="EmpID" Type="Int32" ControlID="GridView1" PropertyName="SelectedDataKey.Value" />
</WhereParameters>
</asp:EntityDataSource>
然后我尝试在另一个 Gridview 中绑定组的名称:
<asp:GridView runat="server" ID="GridView3" DataSourceID="GroupsByEmployeeSource" AutoGenerateColumns="False">
<Columns>
<asp:CommandField />
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="GroupsByEmployee" runat="server" Text='<%#Eval("Groups.Name") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这会引发一个错误,指出组没有属性名称。在此处询问有关它的问题后 - DataBinding: Generic.HashSet`1 不包含名称为的属性,我意识到这是因为 Groups 是一个 HashSet。在我查看了为实体对象生成的代码之后,这更有意义:
public partial class Employee
{
public Employee()
{
this.Employee_Action = new HashSet<Employee_Action>();
this.Groups = new HashSet<Group>();
}
public long EID { get; set; }
public string Manager { get; set; }
public string Location { get; set; }
public string Name { get; set; }
public string SESA { get; set; }
public virtual ICollection<Employee_Action> Employee_Action { get; set; }
public virtual ICollection<Group> Groups { get; set; }
}
在构造函数中,导航属性被创建为 HashSet。不幸的是,在阅读了 HashSets 之后,我意识到它们只能被迭代。所以现在我有一个导航属性,我基本上无法通过我通常将数据绑定到控件的方式访问它。
我不确定访问导航属性需要做什么。我是否将生成的代码更改为 HashSets 以外的代码?有没有办法#Eval() Groups 并实际获取 Group 的属性而不是 HashSet 的属性?我应该在#Eval 通话中投射组吗?对于如何获取由实体的导航属性表示的实体,我非常迷茫。如果答案是以编程方式进行,那么我应该使用什么事件?