您的位置:首页 > 理论基础 > 计算机网络

ASP EF框架,数据库操作类(上下文类)的实例创建,线程内唯一对象(HttpContext)

2018-01-07 20:20 423 查看
因为多个数据库操作类实例(上下文实例),多个实例同时操作数据库可能会引起数据冲突,所以要用一个(同一个)操作类实例(工作单元模式,多次操作数据库,操作多张表,但只链接一次数据库,提高性能。(延迟加载(查询),打上删除、修改标记,添加操作,然后利用同一个数据库操作类.SaveChanges()一次性保存到数据库,这样就只链接了一次数据库,提高了性能))。

如果是所有用户都共用一个实例的话,那么实例一直在被使用,所以就不会被释放。如果用户不断操作数据库,那么操作类实例就会不断的膨胀,最终撑爆内存。

综上,数据库操作类实例需要是线程内唯一对象(一个请求对应一个唯一对象,子线程中不能获取)(利用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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp asp.net c# EF框架
相关文章推荐