实体框架和ObjectContext n层架构

时间:2012-02-13 14:14:21

标签: performance linq entity-framework entity-framework-4 linq-to-entities

我有一个基于非常经典的不同层的n层应用程序:用户界面,服务(WCF),业务逻辑和数据访问。

数据库(Sql Server)显然是通过实体框架来解决的,问题基本上是每个调用都是从用户界面开始并遍历所有层,但是这样做我需要每次为每个操作创建一个新的ObjectContext,并且因为每次我需要重新加载元数据并重新编译查询时,性能都会非常糟糕。

最常见的模式是下面的模式,这就是我实际在做的事情:每次服务接到呼叫时都通过业务层方法创建和传递新的上下文

 public BusinessObject GetQuery(){     
   using (MyObjectContext context = new MyObjectContext()){ 
      //..do something  }    }

为了便于查询,我没有看到任何特定的dealy,它工作正常,但对于复杂和繁重的查询,它会进行2秒查询,以便每次调用持续15秒。

我可以设置ObjectContext静态,它可以解决性能问题,但似乎没有人建议,也因为我无法同时从不同的线程和多个调用访问上下文例外。我可以使它成为线程安全的,但长时间保持相同的ObjectContext使它变得越来越大(也越来越慢),因为它引入每个查询的引用它执行一个查询。

我所拥有的架构我认为它是最常见的,那么实现和使用ObjectContext的最佳和已知方法是什么?

谢谢你, 马可

3 个答案:

答案 0 :(得分:2)

在Web上下文中,最好使用无状态方法并为每个请求创建ObjectContext

ObjectContext建设的成本很低。元数据从全局高速缓存加载,因此只有第一次调用才必须加载它。

静态绝对不是一个好主意。 ObjectContext不是线程保存,当在具有多个调用的WCF服务中使用它时,这将导致问题。使其保存线程将导致性能降低,并且在多个请求中重用它时可能会导致细微的错误。

检查此信息:How to decide on a lifetime for your ObjectContext

答案 1 :(得分:1)

使用静态对象上下文不是一个好主意。 Web应用程序的所有用户将共享静态上下文,这意味着当一个用户对上下文进行修改(例如调用saveChanges)时,使用该上下文的所有其他用户都将受到影响(假设他们已添加或更新这将是一个问题数据到上下文但没有调用保存更改)。使用对象上下文时的最佳实践是在请求期间保持活动状态,并使用if执行任何原子业务操作。您可能想要查看UnitOfWork模式和存储库模式

uow

uow and repository in EF

如果您认为自己的查询存在性能问题,并且可能会重复使用查询,我建议您使用预编译的linq查询。您可以查看以下链接以获取更多信息

precompiled linq julie lermann

precompiled linq

答案 2 :(得分:0)

您展示的是使用上下文的典型模式 - 按请求,类似于使用数据库连接。

是什么让你认为糟糕的表现与重新创造背景有关?这很可能不是这种情况。你是如何衡量这种影响的?

如果你有这样的性能关键代码,这个开销真正重要,你就不应该使用Entity Framework,因为总会有一些开销,即使在一般情况下开销应该很少。我会开始关注您的数据模型以及底层数据存储,它会对您的查询性能产生更大的影响。您是否优化了查询?你把索引放在你需要的任何地方吗?你能否对数据进行去规范化以删除连接?

相关问题