实体的导航属性是HashSet,不能绑定到控件

时间:2013-05-17 17:07:15

标签: c# asp.net entity-framework

我有一个名为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电话中播放群组吗?我很失落如何获得实体的导航属性所代表的实体。如果答案是以编程方式进行,那么我应该使用哪个事件?

1 个答案:

答案 0 :(得分:0)

由于Groups是Group项的集合,您实际上要在列中显示什么?收藏中的第一组?或者集合中的所有组都用逗号分隔?

你可以试试;

Groups.First().Name

string.Join(",", Groups.Select(g => g.Name).ToArray())