Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource - PullRequest
19 голосов
/ 18 февраля 2010

У меня есть две таблицы SQL Server с первичными ключами (PK) и внешним ключом (FK), связывающими две таблицы:

1) Table "Order"

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

2) Table "Address"

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

Затем я создал (ADO.NET) Entity Data Modelиз этих двух таблиц.Теперь на моей (ASP.NET) веб-странице я разместил GridView с EntityDataSource.В моем GridView я хочу отобразить два столбца:

  • OrderID
  • Город (принадлежащий этому порядку и связанный с помощью ключа AddressID)

Какмогу ли я сделать это?Моя проблема: Когда я настраиваю Entity Data Source, я могу выбрать «EntitySetName», который может быть «Order» или «Address», но не оба, и при этом я не могу выбрать какой-либо тип отношений.Если я выберу «Order» в качестве EntitySetName, то в GridView я могу добавить столбцы

  • OrderID
  • Address
  • Address.AddressID

При добавлении столбца «Адрес» отображаются пустые ячейки.Добавление «OrderID» и «Address.AddressID» отображает ожидаемые идентификаторы.Но как я могу добавить «Город» соответствующего адреса в мой GridView?

Заранее благодарен за помощь!

Редактировать: Уточнение:

Entity Framework создал класс «Заказ» и класс «Адрес», соответствующие таблицам базы данных.Класс «Порядок» имеет ссылку на объект «Адрес» в качестве свойства навигации, соответствующего отношению 1-n между таблицей «Адрес» и «Порядок».

В основном я хочу иметь столбец в моем GridView, который отображаетOrder.Address.City.Я попытался добавить связанное поле с «Address.City» в качестве поля данных в GridView, но это приводит к ошибке времени выполнения («нет такого свойства ...»).

1 Ответ

43 голосов
/ 18 февраля 2010

ОК, через много часов я сам нашел решение:

Вариант 1:

Можно использовать свойство select в EntityDataSource, которое позволяет создавать произвольные проекции данных из нескольких связанных сущностей / таблиц базы данных (в моем случае: OrderID из сущности Order и City из Адрес объекта)

Недостаток: использование select в EntityDataSource делает невозможным использование Insert, Update и Delete в GridView!

Вариант 2:

EntityDataSource должен иметь свойство include , чтобы включать свойство соответствующего адреса вместе с запрашиваемыми заказами. Разметка выглядит так:

<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>

Здесь Eval важно. Bind не работает. Также используя BoundField в качестве столбца ...

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

... возможно НЕ возможно. Поэтому в GridView невозможно редактировать город (что имеет смысл, поскольку это связанное поле принадлежит другой таблице и, возможно, многим другим порядкам). Но можно отредактировать плоские поля объекта заказа, а также «AddressID» заказа, чтобы назначить другой адрес.

...