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

283
13 сентября 2018, 15:40

С помощью EntityFramework DataBaseFirst создались классы :

public partial class ExpSections
{
    public ExpSections()
    {
        ExpRemarks = new HashSet<ExpRemarks>();
    }
    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> 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 записей, а в БД записи есть.

Answer 1

В 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> ExpRemarks { get; set; }

См. также:

  • Загрузка связанных данных
  • Entity Framework Core - Lazy Loading
Answer 2

Есть большая таблица сравнения возможностей, где показано, что "умеет" EF Core и, что важно, с какой версии - если умеет.

Многие, кто имеет опыт работы с EF6, очень часто забывают, что EF Core весьма сильно отличается от EF6, и, как следствие, получается такие ситуации.

Как верно подсказал @Андрей-NOP, Include может тут помочь. Но, с версии 2.1 EF Core его можно больше не использовать, т.к. был реализован Lazy Loading.

READ ALSO
Как инициализировать структуру Queue&lt;KeyValuePair&lt;int, byte[]&gt;&gt;

Как инициализировать структуру Queue<KeyValuePair<int, byte[]>>

Kак правильно инициализировать:

256
Как задавать лейбл префабу программно в Unity?

Как задавать лейбл префабу программно в Unity?

Есть ли возможность задавать каждому префабу лейбл программно и если есть, то как это можно сделать ?

223
как можно, во время работы программы, подгружать ресурсы из фала .unitypackage?

как можно, во время работы программы, подгружать ресурсы из фала .unitypackage?

Во время работы приложение сервер должен прислать AssetBundle и файл с расширениемunitypackage, в котором хранится база данных с маркерами

277