EF封装基础的数据操作后DbContext的问题,需保证上下文唯一。

原创 2016年08月31日 13:51:39

使用EF操作数据库,我们会进行一个封装,将DbContext(数据库操作上下文类)提取出来,以便复用。

    public class BaseDBContext: DbContext
    {
        public BaseDBContext() : base("name=xxSysEntities")
        {

        }
    }
然后建立基本的仓储,封装增删改查一些方法。

public class BaseRepository<TEntity> where TEntity : class, new()
 {
        private DbContext db;
        private readonly DbSet<TEntity> dbSet;
        public BaseRepository()
        {
            this.db = new BaseDbContext();
            this.dbSet = db.Set<TEntity>();
        }
 	public void Add(TEntity Model)
        {
            this.dbSet.Add(Model);
        }
        ...void saveChanges(); ..
}

模型对应的仓储继承Base仓储,就拥有了基础的操作方法。

对应的每个Repository都创建的一个新的DbContext数据库上下文对象。

那么当我需要在一个请求里操作两张表的数据怎么办?添加用户,添加角色

创建两个Repository 分别SaveChanges()?

UserRepository user_rep = new UserRepository();

...

user_rep.SaveChanges();


RoleRepository role_rep = new RoleRepository();

xxx

role_rep.SaveChanges();

这样就操作了两次数据库,而且还不能保证数据一致性,可能发生异常。显然是不可取的。

我目前的解决办法是将DbContext上下文对象放在线程内部唯一的数据糟中。

每一次http请求都会开启一个新的线程,我们保证在一个线程(功能)中,DbContext是唯一的就好了。

        public static DbContext GetCurrentDbContext()
        {
            //CallContext:是线程内部唯一的独用的数据槽(一块内存空间)
            //传递DbContext进去获取实例的信息,在这里进行强制转换。
            DbContext dbContext = CallContext.GetData("DbContext") as DbContext;

            if (dbContext == null)  //线程在内存中没有此上下文
            {
                //如果不存在上下文 创建一个(自定义)EF上下文  并且放在数据内存中去
                dbContext = new BaseDBContext();
                CallContext.SetData("DbContext", dbContext);
            }
            return dbContext;
        }
在仓储创建DbContext的时候,使用这个创建就好了,不去new新的DbContext。

 public BaseRepository()
        {
            this.db = DbContextFactory.GetCurrentDbContext();
            this.dbSet = db.Set<TEntity>();
        }

这样在一个Action中只用提交SaveChanges一次就好了。减少数据库的访问,还保证了数据的一致性。




版权声明:本文为博主原创文章,未经博主允许不得转载。

【实例应用】DATATable那些事儿

这几天做成绩分析,天天跟DataTable混在一起,应用了其众多属性和方法。今天,就来八一八DataTable那些常用的方法。 一、去除重复行的操作    在项目中,经常会对表进行固定列的...

jquery表格插件datatables应用实例

jquery表格插件datatables应用实例DataTables的主页是http://www.datatables.net/先上个这个demo的截图,设想的操作是输入客户名称,按检索后进行模糊检索...

EF异常‘在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。 请注意不保证 DbContext 的实例成员’

一、EF的线程安全问题 二、

EF中DbContext如何使用自定义数据源,而不是使用app.config中的链接字符串

如题: 之前在EF使用时,一直纠结于APPCONFIG中的配置的连接字符串,不能使用动态链接字符串; 经过对比,DbContext的构造函数中有一个构造函数如下: // ...
  • pengcwl
  • pengcwl
  • 2017年11月07日 09:09
  • 40

EF5 DBContext与Entity分离-源代码

  • 2017年06月17日 14:01
  • 3.07MB
  • 下载

.net EF DBcontext 简单demo

  • 2016年09月11日 23:56
  • 10.37MB
  • 下载

vs2012 +ef6 操作mysql数据库问题总结

安装完vs2012和mysql5.6后,使用vs2012建立实体数据模型。在建立数据库连接时,出现“无法选择mysql数据库作为数据源”的问题。 针对该问题,只需要安装mysql-connect...
  • tiana0
  • tiana0
  • 2016年12月04日 21:28
  • 841

EF5 通用数据层 增删改查操作,泛型类

using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste...

entity framework (EF)操作mysql数据模型环境准备

废话:之前一直做J2EE项目,目前所在公司项目基本上都是基于asp.net的,于是花点时间快速上手操作一下,记录一下笔记,方便以后查看 关于ef框架的入门知识,了解一下这位哥们写的博客(EF入门系列)...
  • quan_QQ
  • quan_QQ
  • 2017年03月06日 09:05
  • 85
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EF封装基础的数据操作后DbContext的问题,需保证上下文唯一。
举报原因:
原因补充:

(最多只允许输入30个字)