LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对

在linq to sql作为底层数据源时,我们进行一个linq返回结果集的操作,这没有问题,不过,当你进行update操作之后,再使用linq返回结果集时,你会发现,它返回的

信息是不正确的,或者总是发生变化的,这是为何?

事实上,这是由于DataContext本身的机制所决定的,它本身就有缓存机制,当你从数据库把信息得到时,然后修改它,再进行保存,如果你再把信息取出来,这时,你会从datacontext的缓存中得到,而不是真正的数据库里得到,这个datacontext缓存如果想要解决,有几种方法:

1  datacontext不要共享化(不要静态化,不要单例),使用私有datacontext,即每个操作,使用一个新的datacontext。

2  使用派生类,将查询结果保存到实体的子类中,也可以避免这种缓存数据的产生。

下面是具体的代码:


复制代码
 1         /// <summary>
 2         /// 需要把Join的表关系写在这里
 3          /// </summary>
 4          /// <returns></returns>
 5          public IQueryable<User_Info> GetDetailModel()
 6          {
 7              var linq = from data1 in base.GetModel<User_Info>()
 8                        join data2 in base.GetModel<User_Profile>() on data1.UserID equals data2.UserID
 9                        select  new User_Info_Ext
10                            {
11                              ...
12                            };
13            return linq;
14         }
复制代码


我们无法想像把所有查询操作都放在DATA层代码会变得什么样,所以,有时,我们更多的时候需要去创建一种线程安全的,单例的数据上下文对象,这就是我一直
用的dataContext工厂,通过工厂去动态创建DataContext实例,通过lock和thread来实现单线程共享及线程安全的数据上下文对象,更多DataContext知识,
可以访问我的这篇文章

posted @   张占岭  阅读(957)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示