Страницы

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

вторник, 5 февраля 2019 г.

Как использовать колекции в Entity Framework Core?

С помощью EntityFramework DataBaseFirst создались классы :
public partial class ExpSections { public ExpSections() { ExpRemarks = new HashSet(); } public int ExpSectionId { get; set; } public int ExpMainId { get; set; } public string Name { get; set; } public string ExpertName { get; set; } public string ImageName { get; set; }
public ExpMains ExpMain { get; set; } public ICollection ExpRemarks { get; set; } }
public partial class ExpRemarks { public int ExpRemarkId { get; set; } public int ExpSectionId { get; set; } public string Number { get; set; } public string Question { get; set; } public string Answer { get; set; } public string Check { get; set; }
public ExpSections ExpSection { get; set; } }
ExpSections связан один ко многим c ExpRemarks Я так понимаю коллекция внутри класса ExpSections нужна для вывода связанных данных? Как ей воспользоваться, к примеру есть метод:
public IActionResult Method(int id) { ExpSections expSections = _bd.ExpSections.SingleOrDefault(m=>m.ExpSectionId == id);
А как получить связанные данные из класса ExpRemarks, если я пишу так:
Console.WriteLine(expSection.ExpRemark.Count());
Результат 0 записей, а в БД записи есть.


Ответ

В EF Core нет lazy loading (надо бы уточнить, не появилось ли в 2.1), поэтому у вас связанные данные не подгружаются автоматом.
Указывайте явно при загрузке, какие связанные данные вам понадобятся:
_bd.ExpSections.Include(x => x.ExpRemarks) .SingleOrDefault(m=>m.ExpSectionId == id);
Тут тёзка подсказывает, что в core 2.1 наконец впилили поддержку lazy loading так что если у вас есть возможность обновиться и включить lazy loading - то можете использовать как альтернативу.
Я правда люблю контролировать, что и когда грузится, это же лишние накладные расходы на базу и сеть, поэтому предпочитаю держать lazyloading отключенным.
Как включить lazy loading в 2.1 см. в доках, вкратце:
The simplest way to use lazy-loading is by installing the Microsoft.EntityFrameworkCore.Proxies package and enabling it with a call to UseLazyLoadingProxies
И, кстати, обращаю ваше внимание, что для поддержки lazy loading свойства должны быть virtual
public virtual ICollection ExpRemarks { get; set; }
См. также:
Загрузка связанных данных Entity Framework Core - Lazy Loading

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

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