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类型,在引用类 ...
随机推荐
- 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
前述: 在写这篇笔记之前,对笔记中的设计模式进行介绍: 本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式 (1)装饰(包装)设计模式口诀: ...
- 判断iPhone/android手机
JS判断请求来自Android手机还是iPhone手机,根据不同的手机跳转到不同的链接. var browser = {versions: function () {var u = navigator ...
- Sphinx配置过程
http://www.oschina.net/question/84274_11938 http://www.ibm.com/developerworks/library/os-php-sphinxs ...
- angularjs中动态为audio绑定src
今天在angularjs中用audio的时候碰到的这些问题,查阅http://www.cnblogs.com/rachelanlan/p/3598070.html获得解决,感谢! <div cl ...
- 修改maven本地仓库路径
修改maven配置文件conf/settings.xml 在setting标签中添加 <localRepository>E:/bhuwifi_java/repo</localRepo ...
- C#入门经典第八章面向对象编程简介-1
面向对象编程(Object-Oriented Programming,OOP)技术 本章中的OPP实际上是.NET OOP,这里讲的一些技术不能应用于其他OOP环境.
- GuideActivity.java引导界面:
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api. 而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那 ...
- opencart 图片管理器 500错误
网站点击文件夹打不开返回500错误,通过ftp删除大于1M的图片文件即可
- 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!
一.java中流程控制方式采用三种基本流程结构:顺序结构,选择(分支)结构,循环结构. 1.[if-else 结构] if(1>2){ system.out.println("if条件 ...
- Java基于Socket文件传输示例
http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...