再议在Asp.Net中缓存ADO.Net Entity

  上一篇文章中,曾经讲在Asp.Net中采用ADO.Net Entity做缓存的处理方式,就是继承默认的ObjectContext,在保存更新时,Detach所有被Attach过的实体。曾经认为是天衣无缝,其实根本没考虑到在附加实体后,保存更新前,这中间如果出现异常的情况。比如有一个页面有这样的语句:

var DB = new DBContext(); //实体上下文
var person = EmployeeHelper.GetPersonByID(id);   //从缓存中取数据
DB.Attach(person);
person.Name = "流川枫";
person.JoinDate = DateTime.Parse(Request["date"]);
……
DB.SaveChanges();

  如果Request["date"]不是一个有效的日期格式,页面在执行到DB.SaveChanges()之前就会抛出异常,不但本次修改失败,而且以后所有试图修改此条记录的请求也将失败,直到此条记录的缓存过期。

  因此,我们仍然需要保证在即使保存失败,缓存的实体也能从实体上下文脱离,继续保持可更新的机制。就脱离上下文的方式,我试过好几种方式,最终唯一靠谱的就是:将这个上下文彻底销毁,皮之不存,毛将焉附。所以,虽然不情愿,却必须建立对实体上下文的跟踪管理机制。

  跟踪管理又可以有两条路,一种是采用建立资源池方式,这种是比较正统合理的方案,但我相信AEF将来会改进的。所以我目前采用了第二种方式:实体上下文与HttpContext绑定,并在Application_EndRequest事件中执行清理。

  实体上下文构造函数:

        public DBContext()
        {
            var items = HttpContext.Current.Items;
            items["dbContext" + items.Count] = this;
        }

  Global.asax中的函数:

        void Application_EndRequest(object sender, EventArgs e)
        {
            foreach (var item in this.Context.Items.Values)
            {
                var disposableObj = item as IDisposable;
                if (disposableObj != null) disposableObj.Dispose();
            }
        }

  这个问题一波三折,困扰了两个月。虽然看上去很简单地解决了,但是还是不太爽,没更多时间和能力研究更深层的东西了。Visual Studio 2010发布会上一句口号是:Coding完美世界,很多时候,完美其实是只是一个传说。

转载于:https://www.cnblogs.com/XmNotes/archive/2011/04/11/2011976.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值