【问题标题】:Code First and data loading代码优先和数据加载
【发布时间】:2012-04-02 20:32:51
【问题描述】:

我应该在 EF 代码优先或模型优先之间做出选择。

我不确定什么是提高开发效率的最佳解决方案和最简单的 IoC 框架集成解决方案。

我尝试先从代码开始,但无法将导航属性用作 IQueryable。当我声明导航属性时,我使用 ICollection,例如:

public class Invoice {
...
   public ICollection<LineItem> LineItems { get; set; }
...
}

public class LineItem {
...
   public Invoice Invoice { get; set; }
...
}

加载 Invoice 时,由于延迟加载,我的 LineItems 集合为空。

但是,当我从数据库加载此属性时,我是否会先从数据库加载此 Invoice 的所有 LineItem,然后才能将此 Collection 用作 IQueryable?

我的想法是使用 IQueryable 尽可能减少数据库加载以提高性能。

我做错了什么?最佳做法是什么?

当我首先使用数据库时,我可以将导航属性用作开箱即用的 IQueryable,而无需编写任何代理类或包装器。

谢谢

【问题讨论】:

  • “我的导航属性为 IQueryable” - 这并不总是一个优点。
  • 为什么?我可以在数据库受到干扰之前将查询应用于我的集合属性以构建 SQL 查询
  • 看起来延迟加载正在做你想要的,延迟对数据库的实际查询,直到你实际访问记录/实体。但在某些情况下,您将不得不执行 Eagerloading 或关闭延迟加载/代理,不过这将是另一回事。

标签: c# entity-framework database-design


【解决方案1】:

您需要将所有实体属性设为虚拟。这允许 EF 为您的实体生成代理类,以便您可以对其进行查询。

public class Invoice {
     public virtual ICollection<LineItem> LineItems { get; set; }
}

【讨论】:

  • 我启用了延迟加载 this.Configuration.LazyLoadingEnabled = true;并设置我的导航。属性为虚拟。但它不影响导航属性的加载。发票 LineItems 与发票一起加载。它们默认不为空。
  • 延迟加载默认为 EF 4.1 开启。如果您有 LineItems virtual,我怀疑您需要在其他地方查看问题。这个blogs.msdn.com/b/adonet/archive/2011/03/15/… 和这个stackoverflow.com/questions/7619227/… 应该会给你一个想法。
【解决方案2】:

需要 Virtual 关键字才能使延迟加载正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多