Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Непонятная ситуация с DataGrid

Есть две почти одинаковые ситуации. В первой контекст DbContext создается как поле, получает все данные из базы и этот лист привязывает к DataGrid и все работает. Во второй контекст DbContext создается через using, а дальше все так же, но данные которые помеченные как virtual в DataGrid не отображаются. Почему так ?
UPDATE. Данные не помеченные как virtual тоже не отображаются.
UPDATE 2 Если запустить приложение в режиме отладки из метода ShowData, и подождать пару секунд, то данные отображаются так как и нужно. Если пробежаться быстро по методу в отладке то все по старому.
UPDATE 3. Проблема до сих пор актуальная, хочу понять почему так.
Ситуация 1.
class MainVM:BaseVM { ContentStorage db = new ContentStorage();
public MainVM() { ShowData(); }
private List listStorage;
public List ListStorage { get { return listStorage; } set { listStorage = value; OnPropertyChanged(); } }
private void ShowData() { var s = db.Storages.ToList(); ListStorage = s; }
public MainVM() { ShowData(); } }
Ситуация 2.
class MainVM:BaseVM { private List listStorage;
public List ListStorage { get { return listStorage; } set { listStorage = value; OnPropertyChanged(); } }
private void ShowData() { using (var db = new ContentStorage()) { var s = db.Storages.ToList(); ListStorage = s;
} }
public MainVM() { ShowData(); } }


Ответ

Судя по всему, "данные помеченные как virtual" - это навигационные свойства.
EF по умолчанию не загружает связанные сущности. Вместо этого он создает класс-обертку поверх вашего Storage, переопределяя виртуальные свойства так, что они будут подгружены при первом обращении. Этот механизм называется Lazy Load.
Для его работы нужно чтобы контекст, из которого был загружен объект, был жив на момент обращения к свойству. В первом примере контекст жив - и все работает. Во втором - вы уничтожаете его сразу после получения списка. После уничтожения контекста все такие свойства будут бросать исключение (что, скорее всего, съедается гридом)
Вам стоит или держать контекст живым, или явно подгружать связанные сущности:
var s = db.Storages.Include("MyProperty").ToList();
Или
var s = db.Storages.Include(s => s.MyPropery).ToList();

Комментариев нет:

Отправить комментарий