【问题标题】:Enhancing performance on a DAL when it is implemented using Entity Framework使用实体框架实现 DAL 时提高其性能
【发布时间】:2010-12-29 11:06:09
【问题描述】:

我正在使用实体框架实现 DAL。我们有一些 DAL 类(我称它们为存储库)在每次调用方法时通过参数实例化或接收上下文。我不喜欢这种行为;我没有记录这个问题,但我的常识告诉我上下文的实例化消耗了太多的系统资源。所以:

  1. 上下文的实例化成本高吗?
  2. 如果您对 1 的回答为“是”,您将如何从设计角度解决此问题?
  3. 如果您对 1 的回答是“是”,您将如何在 C# 中实现该解决方案?
  4. 您建议采用哪种方法为 Web 应用程序实施 DAL?

【问题讨论】:

    标签: c# .net design-patterns entity-framework-4 .net-4.0


    【解决方案1】:

    我的常识告诉我上下文的实例化消耗了太多的系统资源

    在优化方面,常识几乎毫无用处。

    你认为上下文的构造函数到底有什么问题?你有read the source吗?

    1) 上下文的实例化成本高吗?

    相对于什么?与建立数据库连接所需的时间相比?与执行站点的 DNS 查找所需的时间相比?与浏览器可能花费在渲染页面上的时间相比?

    与通过网络实际检索数据所需的时间相比,上下文的实例化并不是特别耗时。

    2) 如果您对 1 的回答是“是”,您将如何从设计角度解决这个问题?

    使用UnitOfWork abstractionEach UnitOfWork 应该是 contain a single entity context。如果这是一个 Web 应用程序,则每个请求应该有一个 UnitOfWork。

    【讨论】:

      【解决方案2】:

      上下文生命周期管理在使用 ORM 时至关重要。实体框架上下文保存有关已加载实体的信息以用于延迟加载和更改跟踪目的,并且其内存占用可能会增长得非常快。如果你不处理你的上下文,你基本上会有内存泄漏。

      但是,您是正确的,将上下文生命周期保持得太短并不理想,因为您可能希望使用更改跟踪。

      using (var context = new DataContext())
      {
          context.Products.Add(product);
          context.SaveChanges();
      }
      

      上面的示例显示了太快地处理上下文而无法利用更改跟踪的好处。

      对于 Web 应用程序,您应该使用每个请求的上下文。

      对于 Win Form 应用程序,您可以在从一个表单移动到另一个表单时处理上下文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-22
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 2010-12-23
        • 1970-01-01
        相关资源
        最近更新 更多