Entity Framework Core - Ленивая загрузка

В Swift 2:

import Foundation

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{Int($0)}
  }
}

let ans = myArray.sort {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В Swift 1:

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{$0.toInt()}
  }
}

let ans = myArray.sorted {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В обоих случаях этот массив:

let myArray = [
  "Step 6" ,
  "Step 12",
  "Step 5" ,
  "Step 14",
  "Step 4" ,
  "Step 11",
  "Step 16",
  "Step 9" ,
  "Step 3" ,
  "Step 13",
  "Step 8" ,
  "Step 2" ,
  "Step 10",
  "Step 7" ,
  "Step 1" ,
  "Step 15"
]

даст вам этот ответ:

["Step 1", "Step 2", "Step 3", "Step 4", "Step 5", "Step 6", "Step 7", "Step 8", "Step 9", "Step 10", "Step 11", "Step 12", "Step 13", "Step 14", "Step 15", "Step 16"]

(В версии Swift 2.0 вы должны быть в состоянии сделать last.flatMap(Int.init), но по какой-то причине это не работает для меня. ["1", "2"].flatMap(Int.init) разбивает мою игровую площадку. Похож на ошибку.)

29
задан Guillaume Jacquenot 27 December 2016 в 08:52
поделиться

7 ответов

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

На данный момент, если кто-то еще сталкивается с этой проблемой и борется. Ниже приведена демонстрация использования Eager loading , и это то, что вы сейчас должны использовать.

Скажем, до того, как у вас был объект 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

32
ответ дан Michael Freidgeim 27 December 2016 в 08:52
поделиться

Ленивая загрузка теперь доступна на EF Core 2.1, и вот ссылка на соответствующие документы:

https://docs.microsoft.com/en-us/ef/core/querying/ аффилированные данные # отложенная загрузка

28
ответ дан Shree 27 December 2016 в 08:52
поделиться

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

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

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

        optionsBuilder.UseLazyLoadingProxies();
    
  • Это (в настоящее время) предварительная версия, поэтому сила может быть с вами.
6
ответ дан Eric 27 December 2016 в 08:52
поделиться

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

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

4
ответ дан Darxis 27 December 2016 в 08:52
поделиться

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

2
ответ дан baHI 27 December 2016 в 08:52
поделиться

Для 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);
            });
1
ответ дан Kowi 27 December 2016 в 08:52
поделиться

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

Microsoft.EntityFrameworkCore.Proxies

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

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

«Обратите внимание», этот пакет работает на EF Core 2.1.

14
ответ дан user7339584 27 December 2016 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: