Когда я хочу получить больше строк из MainTable, я использую GridView с свойством SelectMethod, поэтому я могу получить доступ к данным из каждой таблицы, подключенной к MainTable с помощью FK like (внутри gridview)
<asp:Label ID="masRegionNameLbl" runat="server" Text='<%#:Item.Region.RegionName %>'></asp:Label>
Здесь я могу получить доступ к столбцу RegionName, который является частью таблицы Region, которая связана с MainTable с помощью навигации (FK RegionId в MainTable).
Теперь я хочу, чтобы каждая запись имела собственную страницу подробностей, где я могу показать более подробную информацию о выбранной записи.
Мой вопрос в том, есть ли какой-либо элемент управления в asp.net, где я мог бы связывать один EF-объект и получать данные аналогично, как в GridView.
Первым вариантом было то, что GridView показал мне только одну запись, но не лучше для дизайна. Во второй раз я попытался загрузить желаемый экземпляр MainTable в codebehind, но в этом случае я могу получить доступ только к физическим полям в MainTable, например. Я могу получить доступ к MainTable.Name, но я не могу получить доступ к MainTable.Region.RegionName. Когда я пытаюсь получить доступ к этому полю, он вызывает следующую ошибку:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Интересно, могу ли я иметь некоторый контроль, когда я просто связываю один объект - MainTable с помощью какого-то метода, и в этом элементе управления я мог бы сделать некоторый html css-дизайн и доступ (просматривать, редактировать) все данные, относящиеся к конкретной записи, которые постоянно привязаны. Или есть ли что-то лучше, чем GridView для этого случая?
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Эта ошибка означает, что вы пытаетесь получить доступ к контексту после его удаления (поскольку ошибка явно говорит :)) EF использует ленивую загрузку для свойств навигации. Итак, что происходит, так это то, что вы получаете доступ к свойству навигации, а EF необходимо получить данные из контекста, но контекст больше не существует.
Существует два варианта:
Вы можете выполнить 2, используя метод Include()
, который инструктирует EF загружать выбранное свойство навигации с нетерпением. Посмотрите здесь для получения дополнительной информации.
EDIT: если вы хотите отменить ленивую загрузку, вы можете сделать это за свойством, не отмечая свойство навигации как virtual
или на уровне контекста, добавив этот код в конструктор:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
DetailsView
данных с именемDetailsView
.