Страницы

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

понедельник, 6 января 2020 г.

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

#c_sharp #aspnet_mvc #entity_framework #aspnet_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 записей, а в БД записи есть.
    


Ответы

Ответ 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 { get; set; } См. также: Загрузка связанных данных Entity Framework Core - Lazy Loading

Ответ 2



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

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

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