EF dbcontext上下文的处理
,那么我们整个项目里面上下文的实例会有很多个,我们又遇到了多次,当我们在编程的时候遇到多的时候,一般我们就要想想能不能解决多这个问题。
(2)这里我要说的是EF上下文怎么管理呢?很简单啦,就是要保证线程内唯一,所以这里我们就要进行修改BaseRepository类了。
(3) 在这里BaseRepository仓储的职责是什么?他的职责就是帮我们实现了所有子仓储的公共方法(增删查改),他的职责不包含怎么去管理上下文的实 例,所以我们不能把这种控制上下文实例的线程内唯一的代码放在这个位置,这就是我们每个类的职责必须唯一,面向对象中的一点就是类的职责必须单一。
(4)下面看一下我们修改后的BaseRepository(仓储),这里我只列出一小部分,因为下面的都没有变化

1 namespace LYZJ.UserLimitMVC.DAL
3 {
5 /// <summary>
7 /// 实现对数据库的操作(增删改查)的基类
9 /// </smmary>
11 /// <typeparam name="T">定义泛型,约束其是一个类</typeparam>
13 public class BaseRepository<T> where T : class
15 {
16
17 //创建EF框架的上下文
19 //EF上下文的实例保证线程内唯一
21 //private DataModelContainer db = new DataModelContainer();
25 private DbContext db = EFContextFactory.GetCurrentDbContext();
26
27 // 实现对数据库的添加功能,添加实现EF框架的引用
28
29 public T AddEntity(T entity)
31 {
32
33 //EF4.0的写法 添加实体
35 //db.CreateObjectSet<T>().AddObject(entity);
37 //EF5.0的写法
39 db.Entry<T>(entity).State = EntityState.Added;
41 //下面的写法统一
43 db.SaveChanges();
45 return entity;
47 }
49 }
51 }

(5)那么我们怎么控制上下文的实例并且要求它是线程内唯一呢?这时候我们不能放到BaseRepository(仓储)中去设置,这时候我们就想到了封装,我们将控制上下文的实例并且要求它是线程内唯一的代码封装到一个公共的类中。这时候怎么做呢?请看下面的做法
(6) 这时候我们看到上面的代码我们不能直接new来实现了(//private DataModelContainer db = new DataModelContainer();),那么我们怎么获取这个实例呢?重点是在这里获取实例的地方必须是公共的,而且还要能够帮我们管理线程内唯 一,这时候我们可以想到我们能够通过工厂来实现这个实例,那么我们在这里创建一个EFContextFactory工厂,在这个工厂里面有 GetCurrentDbContext()方法来返回实例( private DbContext db = EFContextFactory.GetCurrentDbContext();)。
那么这时候我们就需要创建上面的类了。
6.EFContextFactory
(1)这时候我们在LYZJ.UserLimitMVC.DAL类库下面再建立一个EFContextFactory类,在这个类里面含有GetCurrentDbContext方法,下面我解释一下这些代码的实现,我们实现这个方法的代码是:
namespace LYZJ.UserLimitMVC.DAL
{
public class EFContextFactory
{
//帮我们返回当前线程内的数据库上下文,如果当前线程内没有上下文,那么创建一个上下文,并保证
//上线问实例在线程内部是唯一的
public static DbContext GetCurrentDbContext()
{
//CallContext:是线程内部唯一的独用的数据槽(一块内存空间)
//传递DbContext进去获取实例的信息,在这里进行强制转换。
DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
if (dbContext == null) //线程在数据槽里面没有此上下文
{
dbContext = new DataModelContainer(); //如果不存在上下文的话,创建一个EF上下文
//我们在创建一个,放到数据槽中去
CallContext.SetData("DbContext", dbContext);
}
return dbContext;
}
}
}
EF dbcontext上下文的处理的更多相关文章
- EF DbContext.Configuration.ProxyCreationEnabled 什么鬼?
今天在开发项目的时候,使用 EF,突然遇到了这样一个错误: An entity object cannot be referenceed by multiple instances of IEntit ...
- EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回 EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...
- 如何重写EF DBContext 获取链接字符串的方法
public partial class byvarDBFirst: DbContext { //使用自定义连接串 private static string GetEFConnctionString ...
- 第三节:EF Core上下文DbContext相关配置和生命周期
一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...
- [EF]数据上下文该如何实例化?
摘要 之前使用过一段Nhibernate,最近在尝试EF做项目,但对DbContext的实例化,有点困惑,发现和Nhibernate有不同.这里将查找的例子,在这里列举一下. 资料 在EntityFr ...
- MVC下EF添加上下文
这里我们用Code First方法创建数据库表.这个方法简单点说就是先创建Model再根据Model生成数据库表. 为了方便起见,这里用的数据库是Visual Studio自带的LocalDb. 数据 ...
- EF DbContext 并发执行时可能出现的问题
现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...
- EF架构~为EF DbContext生成的实体添加注释(T5模板应用)(转载)
转载地址:http://www.newlifex.com/showtopic-1072.aspx 最近新项目要用Entity Framework 6.x,但是我发现从数据库生成模型时没有生成字段的注释 ...
- EF DBContext中DbSet中Hashset添加对象后,DataGrid UI没有刷新的问题
使用EF4/5添加数据库视图生成DBContext,如果数据表/对象之间有M-N对应关系,EF对自动添加引用类集合,是Hashset类型.由于不是ObservableCellection类型,在引用类 ...
随机推荐
- ubuntu上的mysql数据库双机备份设置
配置环境: myslq 5.5.3 + ubuntu server 12.04 一.配置MySQL主服务器(192.168.0.1) 1.增加一个账号专门用于同步 1 mysql>grant r ...
- 转:通过ant来批量执行jmeter脚本,并生成报告(附: 生成报告时报“Content is not allowed in prolog”这个错误的解决方案)
最近在使用jmeter写脚本来进行测试,最终写了很多份脚本,然后,就在想,这么多脚本,我不可能一个一个的手动去点啊,有没有什么办法来批量运行Jmeter脚本呢? 这个时候,自然而然地想到了万能的ant ...
- angularjs三级联动
<div ng-controller="AjaxCtrl"> <h1>AJAX - Oriented</h1> <div> Coun ...
- JSP文件上传--Smartupload组件
把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...
- 设置span的宽度
设置span的宽度 在默认的情况下,利用css样式对span进行宽度设定是无效,但有时为了某种排版的要求,需要对span进行宽度设定,那么如何在html中利用css样式设定span的宽度? 思路:这看 ...
- php-fpm配置优化
PHP配置文件php-fpm的优化 2013/06/28 php, php-fpm 应用加速与性能调优 评论 6,029 本文所涉及的配置文件名为PHP-fpm.conf,里面比较重要的配置项有如 ...
- RAS、AES、DES加密
---------------------------------------------------------------------------------------------------- ...
- oracle-创建表空间报错 提示ora-01119 ora-27040:无法创建文件
create tablespace syx datafile 'D:\yangk\oraclespace\syx.ora' size 1000m; 低级错误,这是因为指定路径的路径问题,因为指定的路径 ...
- android 以不规则图片为边框切割另外图片
转自:http://blog.sina.com.cn/s/blog_474928c90101dkvf.html 最近工作上遇到了一个将一个图片按照相框进行裁剪的问题,花了一个下午研究了下,在此整理一下 ...
- CentOS 6.5 安装Nvidia驱动后出现"no screens found "错误
参考官网文档 http://cn.download.nvidia.com/XFree86/Linux-x86_64/280.13/README/editxconfig.html 进入更改文档: vi ...