web-dev-qa-db-ja.com

EntityDataSourceを使用した1つのASP.NETGridView内の2つの関連するデータベーステーブルの列

主キー(PK)と外部キー(FK)を持つ2つのSQL Serverテーブルがあり、2つのテーブルをリンクしています。

1) Table "Order"

OrderID, int, PK  
AddressID, int, FK
...

2) Table "Address"

AddressID, int, PK
City, nvarchar(50)
...

次に、これら2つのテーブルから(ADO.NET)エンティティデータモデルを作成しました。今、私の(ASP.NET)Webページに、EntityDataSourceを含むGridViewを配置しました。 GridViewで、2つの列を表示したいと思います。

  • OrderID
  • 市区町村(その順序に属し、AddressIDキーでリンクされています)

どうやってやるの?私の問題は次のとおりです。エンティティデータソースを構成するときに、「Order」または「Address」のいずれかであるが両方ではない「EntitySetName」を選択できます。また、任意の種類の関係を選択することもできません。 EntitySetNameとして「Order」を選択すると、GridViewで列を追加できます

  • OrderID
  • 住所
  • Address.AddressID

「アドレス」列を追加すると、空のセルが表示されます。 「OrderID」と「Address.AddressID」を追加すると、予想されるIDが表示されます。しかし、どうすれば関連する住所の「都市」をGridViewに追加できますか?

よろしくお願いします!

編集:明確化:

Entity Frameworkは、データベーステーブルに対応するクラス「Order」とクラス「Address」を作成しました。クラス「Order」には、ナビゲーションプロパティとして「Address」オブジェクトへの参照があり、AddressテーブルとOrderテーブルの間の1-n関係に対応しています。

基本的に、GridViewにOrder.Address.Cityを表示する列が必要です。データフィールドとして「Address.City」を含むバインドされたフィールドをGridViewに追加しようとしましたが、ランタイムエラーが発生します(「そのようなプロパティはありません...」)。

19
Slauma

OK、何時間も経ってから自分で解決策を見つけました。

オプション1:

使用することが可能です 選択する EntityDataSourceのプロパティ。これにより、いくつかの関連エンティティ/データベーステーブルからデータの任意の投影を作成できます(私の場合:OrderエンティティのOrderIDとAddressエンティティのCity)

欠点:使用 選択する EntityDataSourceで、GridViewでの挿入、更新、削除の使用が不可能になります。

オプション2:

EntityDataSourceには、 含める 照会された注文とともに関連する住所プロパティを含めるプロパティ。マークアップは次のようになります。

<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server" 
    ConnectionString="name=MyEntitiesContext" 
    DefaultContainerName="MyEntitiesContext" 
    EntitySetName="Order" Include="Address"
    EnableDelete="True" EnableInsert="True" 
    EnableUpdate="True">
</asp:EntityDataSource>

次に、GridViewの列コレクションに次のようなテンプレートフィールドを含めることができます。

<asp:TemplateField HeaderText="City" >
  <ItemTemplate>
    <asp:Label ID="LabelCity" runat="server" Text='<%# Eval("Address.City") %>'>
    </asp:Label>
  </ItemTemplate>
</asp:TemplateField>

ここに 評価 は重要。 Bind 動作しません。また、 BoundField 列として...

<asp:BoundField DataField="Address.City" HeaderText="City" />

...は ない 可能。したがって、GridViewでCityを編集することはできません(これは、関連するフィールドが別のテーブルおよびおそらく他の多くの注文に属しているため、意味があります)。ただし、注文エンティティのフラットフィールドと注文の「AddressID」を編集して、別の住所を割り当てることは可能です。

43
Slauma