Ядро платформы 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
Ответ 2
Ленивая загрузка теперь доступна в EF Core 2.1
и здесь есть ссылка на соответствующие документы:
https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading
Ответ 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
Только что вышла предварительная версия, несмотря на то, что она должна быть доступна в полной версии в ближайшее время.
Несколько предостережений:
Ответ 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 ожидается ленивая загрузка - вы можете узнать больше о том, почему это обязательная функция - здесь.