Entity Framework Core - Lazy Loading

前端 未结 7 389
野性不改
野性不改 2020-12-05 12:43

Bowing to my Visual Studios request, I started my latest project using Entity Framework Core (1.0.1)

So writing my database models as I always have using the \'virtu

相关标签:
7条回答
  • 2020-12-05 13:22

    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

    0 讨论(0)
  • 2020-12-05 13:23

    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);
                });
    
    0 讨论(0)
  • 2020-12-05 13:28

    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.

    0 讨论(0)
  • 2020-12-05 13:40

    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.
    0 讨论(0)
  • 2020-12-05 13:42

    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

    0 讨论(0)
  • 2020-12-05 13:43

    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.

    0 讨论(0)
提交回复
热议问题