Какой элемент управления asp.net можно использовать для привязки одного объекта EF?

1

Когда я хочу получить больше строк из 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 для этого случая?

Теги:
entity-framework
controls

1 ответ

1
Лучший ответ

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Эта ошибка означает, что вы пытаетесь получить доступ к контексту после его удаления (поскольку ошибка явно говорит :)) EF использует ленивую загрузку для свойств навигации. Итак, что происходит, так это то, что вы получаете доступ к свойству навигации, а EF необходимо получить данные из контекста, но контекст больше не существует.

Существует два варианта:

  1. Вам нужно воссоздать контекст или не использовать его для начала, прежде чем совершать этот вызов.
  2. Вы можете сказать, что EF загружает эту навигационную собственность с нетерпением, а не лениво.

Вы можете выполнить 2, используя метод Include(), который инструктирует EF загружать выбранное свойство навигации с нетерпением. Посмотрите здесь для получения дополнительной информации.

EDIT: если вы хотите отменить ленивую загрузку, вы можете сделать это за свойством, не отмечая свойство навигации как virtual или на уровне контекста, добавив этот код в конструктор:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}
  • 0
    Спасибо, это работает! Но еще один вопрос: можно ли как-то использовать include with object вместо od string path? Я пытаюсь получить доступ ко всему, что связано с БД в объектах, чтобы я мог просто обновить модель EDMX вместо переписывания строк, когда что-то в БД изменилось.
  • 0
    И чтобы завершить этот ответ, в ASP.NET есть компонент для отдельной записи DetailsView данных с именем DetailsView .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню