【问题标题】:Lazy loading doesn't work for me inEntity Framework 4在Entity Framework 4中延迟加载对我不起作用
【发布时间】:2011-07-05 09:30:18
【问题描述】:

我正在尝试在 EF4 上下文中启用延迟加载。

试图加载数据的代码是:

using (IUnitOfWork uw = new EFUnitOfWork())
{
    foreach (Document doc in uw.Documents.All)
    {        
        Console.WriteLine("Name: {0} Description: {1} Category: {2}", doc.Name, doc.Description, doc.DocumentCategory.Name);
    }
}

我正在试验存储库和工作单元模式,但据我了解,下面的命令应该可以工作。

ctx.ContextOptions.LazyLoadingEnabled = true;

我遇到的问题是在访问 doc.DocumentCategory.Name 时,我得到了 NullReferenceException。

为什么不延迟加载这些数据?

如果我已加载 DocumentCategories,则 DocumentCategory 属性已解析。

我的 Document 类定义如下:

public class Document
{
    public Document()
    {

    }

    public Document(int id)
    {
        Id = id;
    }

    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual int DocumentCategoryId { get; set; }
    public virtual bool Deleted { get; set; }
    public DocumentCategory DocumentCategory { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

【问题讨论】:

  • 所有文档都有 DocumentCategory 吗?只是想知道 LazyLoading 确实尝试检索给定 Document 的 DocumentCategory 但没有找到,因此返回 null 并导致您的 NullReferenceException。
  • 是的,DocumentCategoryId是数据库中不可为空的字段,表之间存在外键。
  • 导航属性是否标记为虚拟?你能告诉我们你的 Document 类的定义吗?
  • 我已经发布了我的 Document 类,DocumentCategory 属性未声明为虚拟的。

标签: c# .net sql-server entity-framework


【解决方案1】:

还需要将 DocumentCategory 属性标记为虚拟才能支持延迟加载。看看http://msdn.microsoft.com/en-us/library/dd468057.aspx

【讨论】:

  • 谢谢,标记为答案,因为您在问题 cmets 中首先到达那里。
【解决方案2】:

Document.DocumentCategory 是否声明为虚拟的? EF 需要这个来生成代理类型,当您访问该属性时,它将实际执行延迟加载。 (否则 EF 不知道,当你访问属性的值时)

此外,如果 DocumentCategory 已经是虚拟的,则可能有其他属性阻止 EF 生成代理类型。使用调试器检查“文档”实例,看看它是否真的是代理类型。

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2011-02-27
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多