У меня есть две таблицы 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 я хочу отобразить два столбца:
Как я могу сделать это? Моя проблема: Когда я настраиваю Источник данных Объекта, я могу выбрать "EntitySetName", который может быть или "Порядком" или "Адресом", но не обоими, и при этом я не могу выбрать вид отношений. Если я выбираю "Порядок" как EntitySetName тогда в GridView, я могу добавить столбцы
Добавление столбца "Address" отображает пустые ячейки. Добавление "OrderID" и "Адреса. AddressID" отображает ожидаемые идентификаторы. Но как я могу добавить "Город" связанного адреса к моему GridView?
Спасибо за справку заранее!
Править: Разъяснение:
Платформа Объекта создала класс "Порядок" и класс "Адрес", соответствующий таблицам базы данных. Класс "Порядок" имеет ссылку на объект "Адреса" как свойство навигации, соответствуя 1-n отношениям между таблицей Address и Order.
В основном я хочу иметь столбец в своем GridView, который отображает Порядок. Адрес. Город. Я попытался добавить связанное поле с "Адресом. Город" как поле данных к GridView, но это приводит к ошибке периода выполнения ("никакое такое свойство...").
Я думаю, что в данном случае вы не знаете, потому что вы не должны знать. Если вы пишете что-то, что расширяет или реализует (класс 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» заказа, чтобы назначить другой адрес.