Ядро платформы Entity Framework - ленивая загрузка

Поклонившись моему запросу Visual Studios, я начал свой последний проект с использованием Entity Framework Core (1.0.1)

Итак, пишу мои модели баз данных, поскольку я всегда использую "виртуальный" спецификатор, чтобы включить ленивую загрузку для списка. Хотя при загрузке родительской таблицы кажется, что список дочерних элементов никогда не загружается.

Родительская модель

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}

Модель ребенка

public class EventInclusions
{
    [Key]
    public int EventIncSubID { get; set; }
    public string InclusionName { get; set; }
    public string InclusionDesc { get; set; }
    public Boolean InclusionActive { get; set; }

}

Добавление новых записей в эти таблицы, похоже, работает, поскольку я привык к тому, где я могу вложить записи EventInclusions в список в записи Events.

Хотя при запросе этой таблицы

_context.Events.Where(e => e.EventName == "Test")

Проблема

EventInclusions вернет нулевое значение независимо от данных за кулисами.

После чтения немного я чувствую, что это изменение между EF6, которое я обычно использую, и EF Core

Я мог бы использовать некоторую помощь в создании обложки Lazy Loading on или определении нового формата для указания Lazy Loading.

Caz

Ответ 1

Итак, похоже, что EF Core в настоящее время не поддерживает ленивую загрузку. Его приход, но может быть ненадолго.

Теперь, если кто-то еще сталкивается с этой проблемой и борется. Ниже приведена демонстрация использования Желаемой загрузки, которая теперь используется.

Скажите, прежде чем у вас был объект person, и этот объект содержал список шляпок в другой таблице.

Вместо записи

var person = _context.Person.Where(p=> p.id == id).ToList();

person.Hats.Where(h=> h.id == hat).ToList();

Вам нужно написать

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();

И тогда person.Hats.Where(h=> h.id == hat).ToList(); будет работать

Если у вас несколько списков - цепочка включает

var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets)
                            .Include(p=> p.Smiles).Where(p=> p.id == id).ToList();

Я понимаю, почему этот метод безопаснее, что вы не загружаете огромные массивы данных, которые могут замедлить работу. Но я надеюсь, что они скоро начнут загружать Lazy!!!

Caz

Ответ 3

Вы можете установить этот пакет для включения отложенной загрузки в EF Core 2.1.

Microsoft.EntityFrameworkCore.Proxies

а затем установите этот конфиг в вашем ef dbContext

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     => optionsBuilder
           .UseLazyLoadingProxies()
           .UseSqlServer("myConnectionString");

"Обратите внимание", этот пакет работает только на EF Core 2.1 и выше.

Ответ 4

Только что вышла предварительная версия, несмотря на то, что она должна быть доступна в полной версии в ближайшее время.

Несколько предостережений:

  • Все ваши свойства данных, которые представляют собой нечто большее, чем простые типы (т.е. Любые другие классы/таблицы), должны быть общедоступными виртуальными объектами (по умолчанию это не так).
  • Эта строка добавляется в OnConfiguring для вашего контекста данных:

        optionsBuilder.UseLazyLoadingProxies();
    
  • Это (в настоящее время) предварительный релиз, так что сила может быть с вами.

Ответ 5

Для EF Core 2.1 и выше

Установка:

 dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4 

Затем обновите файл Startup.cs, как указано ниже.

using Microsoft.EntityFrameworkCore.Proxies;



services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
            {
                options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
                options.UseLazyLoadingProxies(true);
            });

Ответ 6

LazyLoading еще не поддерживается EF Core, но есть неофициальная библиотека, которая позволяет LazyLoading: https://github.com/darxis/EntityFramework.LazyLoading. Вы можете использовать его, пока он официально не поддерживается. Он поддерживает EF Core v1.1.1. Он доступен как пакет nuget: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

Отказ от ответственности: я являюсь владельцем этого репо и приглашаю вас попробовать его, сообщить о проблемах и/или внести свой вклад.

Ответ 7

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