Entity Framework Core - Lazy Loading

旧时模样 提交于 2019-11-30 08:07:35
Caz1224

So it appears that EF Core does not currently support lazy loading. Its coming but may be a while off.

For now if anyone else comes across this problem and is struggling. Below is a demo of using Eager loading which is what for now you have to use.

Say before you had a person object and that object contained a List of Hats in another table.

Rather than writing

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

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

You need to write

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

And then person.Hats.Where(h=> h.id == hat).ToList(); will work

If you have multiple Lists - Chain the Includes

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

I kinda get why this method is safer, that your not loading huge data sets that could slow things down. But I hope they get Lazy loading back soon!!!

Caz

Elijah Lofgren

Lazy loading is now available on EF Core 2.1 and here is link to the relevant docs:

https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

pejman

you can instaling this package for enable lazy loading in EF Core 2.1.

Microsoft.EntityFrameworkCore.Proxies

and then set this config in your ef dbContext

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

"Notice" this package works only on EF Core 2.1 and above.

There's a pre-release version that just came out, regardless it's supposed to be available in full release soon.

A couple of caveats:

  • All your data properties that are more than simple types (ie: any other classes/tables) need to be public virtuals (default scaffolding they're not).
  • This line gets tucked into OnConfiguring on your data context:

        optionsBuilder.UseLazyLoadingProxies();
    
  • It's (currently) pre-release so may the force be with you.

For EF Core 2.1 and above,

Install:

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

Then Update your Startup.cs file as indicated below.

using Microsoft.EntityFrameworkCore.Proxies;



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

LazyLoading is not yet supported by EF Core, but there is a non-official library that enables LazyLoading: https://github.com/darxis/EntityFramework.LazyLoading. You can use it until it is officially supported. It supports EF Core v1.1.1. It is available as a nuget package: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

Disclaimer: I am the owner of this repo and invite you to try it out, report issues and/or contribute.

Lazy load is planned to be in EF core 2.1 - you can read more on why it is a must-have feature - here.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!