最近用ado.net entity framework遇到了和NHibernate上相同的问题:

      1、open session in view如果entity的objectcontext在dao层关闭的话,在其他层访问lazy-load的属性就会出错,这都是因为上下文已经关闭的缘故,当然过早关闭上下文还会造成(1)在一次访问中多个DAO频繁的新建objectcontext造成不必要的麻烦;2、在更新或者删除时经常要为把从其他dao上下文里获取的数据附加到当前上下文这样极度繁琐的操作。(N)Hibernate做为一个老牌的orm框架通过引入open session  in view的方式避免上述问题,使得一次访问多个dao只使用一个session,而且把关闭的操作放在一次http访问的最后时间进行,也就是建个httpmodule在beginrequset事件时新建session,并在endrequest事件时提交事务并关闭,这样就可以实现透明的持久化和lzay-load。

      由于ado.net entity framework和NHibernate很相似,所以可以借鉴NHibernate的处理方式实现一个ado.net entity framework版的open session in view,代码如下。

 首先实现一个从httpcontext上下文中获取objectcontext的help类

 

    }

 

实现ihttpmodule

    }

 

这样只要在dao中从help中获取objectcontext,我们进行完操作后不须显示的关闭。

 2、范型DAO

     在使用NHibernate时,范型DAO是个常用的省事技巧,将基础的crud写在范型DAO中,其他DAO只要去继承它,就可以公用一套crud方法,这在NHibernate中是很容易实现的,不过由于entity frameword比较笨拙,实现比起NHibernate要难看一些,代码如下

  1像NHibernate致敬-ado.net entity framework的范型DAO和open session in view实现public class GenericEFDao<Context,T> where Context:ObjectContext where T : class
  2#endregion

 

     由于entity framework和NHibernate的相似性,我们可以把NHibernate中的最佳实践嫁接过来,使得在使用ado.net entity framework能够得心应手,不过由于项目还没完成,对于这样使用是否会发生 淮橘为枳的问题现在还是未可知的,只有等到系统上线的时候才能知道。

相关文章:

  • 2022-12-23
  • 2021-11-05
  • 2021-06-29
  • 2022-02-26
  • 2022-12-23
  • 2021-07-26
  • 2021-12-27
猜你喜欢
  • 2021-09-15
  • 2021-06-17
  • 2021-11-12
  • 2021-08-26
  • 2021-08-13
  • 2021-09-22
相关资源
相似解决方案