Groups というナビゲーション プロパティを持つ Employee というエンティティがあります。
グループは、名前のプロパティを持つグループ エンティティにマップされます。
リレーショナル データを設定するために、次の質問に対する回答を実装しました: 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>
これにより、Groups にプロパティ Name がないというエラーがスローされます。ここで質問した後 - 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; }
}
コンストラクターでは、ナビゲーション プロパティが HashSets として作成されます。残念ながら、HashSets について読んだ後、反復処理しかできないことに気付きました。これで、通常はデータをコントロールにバインドする方法では基本的にアクセスできないナビゲーション プロパティができました。
ナビゲーション プロパティにアクセスするために何をする必要があるかわかりません。生成されたコードを HashSets 以外のものに変更しますか? グループを #Eval() し、実際に HashSet のプロパティの代わりにグループのプロパティを取得する方法はありますか? #Eval 呼び出しでグループをキャストする必要がありますか? エンティティのナビゲーション プロパティによって表されるエンティティを取得する方法について、私は非常に迷っています。答えがプログラムで実行することである場合、どのイベントを処理する必要がありますか?