实体框架核心 - 延迟加载

时间:2016-10-19 04:30:34

标签: c# entity-framework-core

向我的Visual Studios请求鞠躬,我使用Entity Framework Core(1.0.1)

启动了我的最新项目

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

父模型

public static void Message()
{
    PageSource = driver.getPageSource();

    // set up Array of search strings
    List<String> searchText = new ArrayList<String>();
    searchText.add("Test1");
    searchText.add("Test2");
    searchText.add("Test3");

    // loop through Array looking for each string contained
    for (String text : searchText)
    {
        if (PageSource.contains(text))
        {
            System.out.println("Found: <" + text + ">");
            return;
        }
    }

    System.err.println("No Match");
}

儿童模型

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}

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

虽然我查询此表

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都将返回空值。

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

我可以使用一些帮助来制作一个随机的Lazy Loading on语句,或者找出用于指定延迟加载的新格式。

CAZ

7 个答案:

答案 0 :(得分:31)

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

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

在您拥有一个人物对象之前说,该对象在另一个表中包含一个帽子列表。

而不是写

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

答案 1 :(得分:27)

EF Core 2.1现在提供延迟加载,此处链接指向相关文档:

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

答案 2 :(得分:14)

您可以安装此软件包以在EF Core 2.1中启用延迟加载。

Microsoft.EntityFrameworkCore.Proxies

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

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

“注意”,此程序包适用于EF Core 2.1。

答案 3 :(得分:6)

刚出现了pre-release version,不管它是否应该很快就会完整发布。

有几点需要注意:

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

        optionsBuilder.UseLazyLoadingProxies();
    
  • 它(目前)预先释放所以力量可能与你同在。

答案 4 :(得分:4)

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

免责声明:我是此回购的所有者,并邀请您试用,报告问题和/或做出贡献。

答案 5 :(得分:2)

延迟加载计划在EF核心2.1中 - 您可以详细了解它为什么是必备功能 - here

答案 6 :(得分:1)

对于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);
            });