我有一个名为Employee的实体,它有一个名为Groups的导航属性。
组映射到具有Name属性的Group实体。
为了设置关系数据,我实现了这个问题的答案: Columns of two related database tables in one ASP.NET GridView with EntityDataSource
我有一个Employees实体,也包括他们的团队:
<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>
这会抛出一个错误,指出Groups没有属性Name。在这里询问了一个问题之后 - DataBinding: Generic.HashSet`1 does not contain a property with the name我意识到这是因为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()组并实际获取组的属性而不是HashSet的属性?我应该在#Eval电话中播放群组吗?我很失落如何获得实体的导航属性所代表的实体。如果答案是以编程方式进行,那么我应该使用哪个事件?
答案 0 :(得分:0)
由于Groups是Group项的集合,您实际上要在列中显示什么?收藏中的第一组?或者集合中的所有组都用逗号分隔?
你可以试试;
Groups.First().Name
或
string.Join(",", Groups.Select(g => g.Name).ToArray())