Столбцы двух связанных таблиц базы данных в одном 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) Модель данных Объекта из тех двух таблиц. Теперь на моем (ASP.NET) веб-страница я поместил GridView с EntityDataSource. В моем GridView я хочу отобразить два столбца:

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

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

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

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

Спасибо за справку заранее!

Править: Разъяснение:

Платформа Объекта создала класс "Порядок" и класс "Адрес", соответствующий таблицам базы данных. Класс "Порядок" имеет ссылку на объект "Адреса" как свойство навигации, соответствуя 1-n отношениям между таблицей Address и Order.

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

19
задан Slauma 17 February 2010 в 23:47
поделиться

1 ответ

Я думаю, что в данном случае вы не знаете, потому что вы не должны знать. Если вы пишете что-то, что расширяет или реализует (класс Employee), то вы должны посмотреть документы или исходный код.

Если, как в вашем примере, вы просто используете некоторые классы/интерфейсы, вам не нужно знать или заботиться, является ли класс Person конкретным или абстрактным, или интерфейсом, если он имеет четко определенный API.

-121--4154786-

Хороший старт для игрового цикла: http://wiki.igda.org/Programming_and_Technology/Game_Programming_Patterns_for_Beginners/Game_Loop

-121--3787266-

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

Вариант 1:

Можно использовать выбрать Адресная сущность)

Недостаток: использование выбора в источнике данных 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» заказа, чтобы назначить другой адрес.

43
ответ дан 30 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: