实体框架核心 - 延迟加载

Caz*_*224 34 c# entity-framework-core

鞠躬我的Visual Studios请求,我使用Entity Framework Core(1.0.1)启动了我的最新项目

所以编写我的数据库模型,因为我总是使用'​​虚拟'说明符来启用List的延迟加载.虽然在加载父表时,似乎子目录永远不会加载.

父模型

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

儿童模特

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

}
Run Code Online (Sandbox Code Playgroud)

向这些表添加新记录似乎可以正常工作,因为我习惯于将EventInclusions记录嵌套在Events记录中作为List.

虽然当我查询这个表

_context.Events.Where(e => e.EventName == "Test")
Run Code Online (Sandbox Code Playgroud)

问题

无论幕后数据如何,EventInclusions都将返回空值.

读了一下后,我感觉这是我通常使用的EF6和EF Core之间的变化

我可以使用一些帮助来制作一个毯子上的Lazy Loading语句,或者找出指定Lazy Loading的新格式.

CAZ

Caz*_*224 35

所以看来EF Core目前不支持延迟加载.它的到来但可能还有一段时间.

现在如果有其他人遇到这个问题并且正在挣扎.下面是使用Eager加载的演示,这是您现在必须使用的.

在你有一个person对象之前说,那个对象包含另一个表中的Hats List.

而不是写作

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

person.Hats.Where(h=> h.id == hat).ToList();
Run Code Online (Sandbox Code Playgroud)

你需要写

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();
Run Code Online (Sandbox Code Playgroud)

然后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();
Run Code Online (Sandbox Code Playgroud)

我有点理解为什么这种方法更安全,你没有加载可能减慢速度的大数据集.但是我希望他们很快就能让Lazy回来!

CAZ

  • 当我必须急切加载导航属性时,您是否知道如何实现存储库模式?当你需要未知数量的"包含"功能时,这根本不容易......任何想法? (4认同)

Eli*_*ren 33

现在可以使用延迟加载EF Core 2.1,这里是相关文档的链接:

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


小智 19

您可以安装此程序包以在EF Core 2.1中启用延迟加载.

Microsoft.EntityFrameworkCore.Proxies
Run Code Online (Sandbox Code Playgroud)

然后在您的ef dbContext中设置此配置

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     => optionsBuilder
           .UseLazyLoadingProxies()
           .UseSqlServer("myConnectionString");
Run Code Online (Sandbox Code Playgroud)

"注意"此程序包适用于EF Core 2.1.


Eri*_*ric 7

有一个刚刚发布预发布版本,无论它是否应该很快就可以完整发布.

几点需要注意:

  • 除了简单类型(即:任何其他类/表)之外的所有数据属性都需要是公共虚拟(默认脚手架,它们不是).
  • 此行包含在您的数据上下文中的OnConfiguring:

        optionsBuilder.UseLazyLoadingProxies();
    
    Run Code Online (Sandbox Code Playgroud)
  • 这是(目前)预先释放所以力量可能与你同在.


小智 6

对于EF Core 2.1及更高版本,

安装:

 dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4 
Run Code Online (Sandbox Code Playgroud)

然后如下所示更新您的Startup.cs文件。

using Microsoft.EntityFrameworkCore.Proxies;



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


Dar*_*xis 5

EF Core 尚不支持 LazyLoading,但有一个非官方库可以启用 LazyLoading: https: //github.com/darxis/EntityFramework.LazyLoading。您可以使用它,直到得到正式支持为止。它支持 EF Core v1.1.1。它可以作为 nuget 包提供:https ://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

免责声明:我是此存储库的所有者,并邀请您尝试、报告问题和/或做出贡献。