zoukankan      html  css  js  c++  java
  • 像NHibernate致敬ado.net entity framework的范型DAO和open session in view实现

          最近用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类

    EntityHelp

    实现ihttpmodule

    OSIVHttpModule

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

     2、范型DAO

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

      1public class GenericEFDao<Context,T> where Context:ObjectContext where T : class
      2    {
      3        private Context _db = EntityHelp.GetEntity() as Context;
      4        public Context db
      5        {
      6            get return _db; }
      7        }

      8
      9
     10        CRUD
     84        
     85        help

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

  • 相关阅读:
    js 实现树效果
    (转)JavaScript 冒泡实例与阻止冒泡方法
    (转)js全页面刷新方法
    js 右键菜单
    (转)js,jQuery屏蔽鼠标右与jquery 鼠标右键事件、左键单击事件判定
    Flex取xml文件中的值
    oracle相关时间计算,得到季度第一天、最后一天
    (转)ASP.NET MVC VS2010中更改默认调试浏览器
    JS 与 后台如何获取 Cookies
    js 弹出新页面
  • 原文地址:https://www.cnblogs.com/brightwang/p/1346667.html
Copyright © 2011-2022 走看看