Подтвердить что ты не робот

Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource

У меня есть две таблицы 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-ключа)

Как я могу это сделать? Моя проблема: когда я настраиваю источник данных сущностей, я могу выбрать "EntitySetName", которое может быть либо "Заказ", либо "Адрес", но не оба, и я не могу выбрать какие-либо отношения. Если я выберу "Заказ" в качестве EntitySetName то в GridView я могу добавить столбцы

  • OrderID
  • Адрес
  • Address.AddressID

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

Благодарим вас за помощь!

Изменить: Уточнение:

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

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

4b9b3361

Ответ 1

Хорошо, слишком много часов спустя я нашел решение самостоятельно:

Вариант 1:

В объекте EntityDataSource можно использовать свойство select, которое позволяет создавать произвольные проекции данных из нескольких связанных сущностей/таблиц базы данных (в моем случае: 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. Привязка не работает. Также используйте BoundField в качестве столбца...

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

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