标签归档:Entity Framework

关于EnitiyFramework的ObjectConext生命周期

最近在一个项目里用了EntityFramework作为持久层。发现在Web系统中使用EF框架还是有一些东西需要注意的。有一点就是ObjectContext的生命周期。

在见到的多数EF框架的实例代码中,很多人喜欢使用using语句方式创建ObjectContext,最初我的代码也是这样书写的,后来发现其实有很多不便。然后仔细研究了一下到底应该怎么管理ObjectConext的生命周期。这儿常见的ObjectContext生命周期管理方式有四种:

  • 每个原子操作分配一个ObjectContext
  • 全局共用一个ObjectContext
  • 每个线程创建一个ObjectContext
  • 每个业务对象分配一个ObjectConext

原子操作分配ObjectConext,就是常见的using方式,一系列操作创建一个对象,用后即销毁。代码常常是这种:

我在DAO中使用了这种写法,但是并不方便。因为DAO层只应该负责数据的读写,那么一次数据操作上下文对象结束了,但是业务中,通常要多长存取,实体对象要再次持久化,就比较麻烦了(一个实体是关联到一个ObjectContext对象的,不能关联多个,关联不一致也不能被保存)。最后被迫把复杂的逻辑推向了DAO,这影响了架构的稳定性。在WebService类型的应用中使用这种方式,还是很科学的。因为WebService本身就是无状态的,原子操作内使用一个ObjectContext对象是非常科学的。

全局共用一个ObjectContext,即系统启动的时候,创建一个ObjectContext对象保存到静态变量里面。这种方式适合于桌面应用,多线程应用中可能会出现并发问题,或者效率问题。

为每个线程创建一个ObjectContext,这种做法比较适合于Web应用。ASP.NET的Web应用里面每个请求都是短暂的,在一个请求内使用一个ObjectContext,可以很方便的管理上下文。实现的思路很简单,将ObjectContext添加到HttpContext中,在RequestEnd事件时销毁。关于这个的实现,可以参考这篇文章:

《自定义Unity对象生命周期管理集成ADO.NET Entity Framework》

http://www.cnblogs.com/shanyou/archive/2008/08/24/1275059.html

这篇文章里面使用Unity这个简单的DI容器。

每个请求一个ObjectContext对象的方式,更像是Hibernate的Session对象的使用方式。在和Spring整合后,利用Filter实现将Session的生命周期延长至视图。

对每个业务对象分配一个ObjectContext的方式,就是针对每个实体进行上下文对象的分配。这种方式还没有真正使用过,不好做评论,只是看到一些技术文章里面有提到。

使用Entity Framework访问MySQL数据库

简介

Entity Framework (EF,ADO.NET Entity Framework)是微软官方提供的.NET平台的ORM框架。相比于LINQ TO SQL,EF框架具有很明显的优势:

  • EF框架支持多种数据库,而不仅仅局限于微软的SQL Server,MySQL,Oracle都有良好的支持。
  • 支持存储过程。
  • 强大的可视化模型设计工具,与Visual Studio深度整合。
  • 与.NET平台的其他技术整合良好。

继续阅读