0

我有一个名为 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 通话中投射组吗?对于如何获取由实体的导航属性表示的实体,我非常迷茫。如果答案是以编程方式进行,那么我应该使用什么事件?

4

1 回答 1

0

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

你可以试试;

Groups.First().Name

或者

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

于 2013-05-18T12:51:19.273 回答