ASP EF框架,数据库操作类(上下文类)的实例创建,线程内唯一对象(HttpContext)
2018-01-07 20:20
423 查看
因为多个数据库操作类实例(上下文实例),多个实例同时操作数据库可能会引起数据冲突,所以要用一个(同一个)操作类实例(工作单元模式,多次操作数据库,操作多张表,但只链接一次数据库,提高性能。(延迟加载(查询),打上删除、修改标记,添加操作,然后利用同一个数据库操作类.SaveChanges()一次性保存到数据库,这样就只链接了一次数据库,提高了性能))。
如果是所有用户都共用一个实例的话,那么实例一直在被使用,所以就不会被释放。如果用户不断操作数据库,那么操作类实例就会不断的膨胀,最终撑爆内存。
综上,数据库操作类实例需要是线程内唯一对象(一个请求对应一个唯一对象,子线程中不能获取)(利用HttpContext对象)。
未封装版:
封装版:
如果是所有用户都共用一个实例的话,那么实例一直在被使用,所以就不会被释放。如果用户不断操作数据库,那么操作类实例就会不断的膨胀,最终撑爆内存。
综上,数据库操作类实例需要是线程内唯一对象(一个请求对应一个唯一对象,子线程中不能获取)(利用HttpContext对象)。
未封装版:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class WebForm3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { //EFFristModelEntities db = new EFFristModelEntities(); //数据库操作类,上下文类。 EFFristModelEntities db = null; if (HttpContext.Current.Items["db"] == null) { db = new EFFristModelEntities(); HttpContext.Current.Items["db"] = db; //线程内唯一对象。 } else { db = HttpContext.Current.Items["db"] as EFFristModelEntities; } var userInfoList = from u in db.UserInfo where u.ID == 343 select new { UName = u.UserName, UPwd = u.UserPass }; //查询部分列,匿名类。并不是UserInfo类型。select u;表示查询全部列,此时userInfo是UserInfo类型。 foreach (var userInfo in userInfoList) //userInfo并不是UserInfo类型。 { Response.Write(userInfo.UName + ":" + userInfo.UPwd); } } } }
封装版:
using XXX.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; namespace XXX.DAL { //负责创建EF数据操作上下文实例,必须保证线程内唯一. public class DBContextFactory { public static DbContext CreateDbContext() { DbContext dbContext = (DbContext)CallContext.GetData("dbContext"); //CallContext就是HttpContext(线程内唯一对象) if (dbContext == null) { dbContext = new OAEntities(); //new XXEntities(); CallContext.SetData("dbContext", dbContext); } return dbContext; } } }
相关文章推荐
- EF上下文对象创建之线程内唯一
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一
- EF 保证线程内唯一 上下文的创建
- 保证EF上下文实例是线程内唯一
- ASP.net如何保证EF操作类线程内唯一
- EF异常‘在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。 请注意不保证 DbContext 的实例成员’
- C# 线程内唯一对象(HttpContext)
- 线程内唯一对象HttpContext
- <框架篇(2)>Spring框架中实例对象(bean)的创建方式(一)
- asp中创建Microsoft.xmlhttp对象从服务器无法获取自己本地IIS运行出来的网页内容
- HttpContext.Current.Server.MapPath("") 未将对象设置到引用的实例异常。
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- EF查询创建上下文实体对象
- php面象对象数据库操作类实例
- HttpContext.Current.Cache 提示:未将对象引用设置到对象的实例
- 创建XMLHttpRequest对象的一个实例
- 创建XMLHttpRequest对象的一个实例
- 组件设计:补白[深入剖析ASP.NET组件设计]一书中HttpApplication对象创建的细节
- 创建XMLHttpRequest对象的一个实例