【问题标题】:Entity Framework Core - lazy loading doesn't workEntity Framework Core - 延迟加载不起作用
【发布时间】:2019-03-12 07:47:55
【问题描述】:

给定以下 3 个(简化的)类:

  • A 类 { int Id; }
  • B 类 { int Id; }
  • JunctionClass { ClassA classA; B类B类; }

当我尝试加载JunctionClass 列表时...

var junctionClassList = _appDbContext.JunctionClass
                                     .Include(jc => jc.ClassA)
                                     .Include(jc => jc.ClassB).ToList();

代码不会加载 ClassAClassB 对象。

我找到了解决方法,但我认为我使用 EF Core 的方式不应该是这样:

var classAList = _appDbContext.ClassA.ToList();
var classBList = _appDbContext.ClassB.ToList();

var junctionClassList = _appDbContext.JunctionClass
                                     .Include(jc => jc.ClassA)
                                     .Include(jc => jc.ClassB).ToList();

这样,junctionClassList 对象也将加载 classAclassB 依赖项。

我的问题是 - 这是使用延迟/急切加载的正确方法吗?还是有别的办法?

【问题讨论】:

  • 你在 JunctionClass 中为 ClassA 和 ClassB 添加了 virtual 关键字吗?
  • 我做了,但仍然没有结果。但是,添加“virtual”关键字后,我没有更新数据库。我应该吗?
  • 你有哪个 EF Core 版本?
  • 2.1.3-rtm-32065

标签: c# entity-framework-core asp.net-core-2.0


【解决方案1】:

在这种情况下,您正在使用 Include 使用 Eager 加载。 Lazy loading 在 EF Core 2.1 中引入。您需要明确启用它。

【讨论】:

  • 如果我现在使用 Eager 加载,不应该加载 classA 和 classB 对象吗?
【解决方案2】:

以下定义适用于Include

    public class JunctionClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ClassA ClassA { get; set; }
    public virtual ClassB ClassB { get; set; }

}
public class ClassA
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class ClassB
{
    public int Id { get; set; }
    public string Name { get; set; }

}

与我们分享与您的不同之处。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多