,那么我们整个项目里面上下文的实例会有很多个,我们又遇到了多次,当我们在编程的时候遇到多的时候,一般我们就要想想能不能解决多这个问题。

(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上下文的处理的更多相关文章

  1. EF DbContext.Configuration.ProxyCreationEnabled 什么鬼?

    今天在开发项目的时候,使用 EF,突然遇到了这样一个错误: An entity object cannot be referenceed by multiple instances of IEntit ...

  2. EF架构~为EF DbContext生成的实体添加注释(T5模板应用)

    回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...

  3. 如何重写EF DBContext 获取链接字符串的方法

    public partial class byvarDBFirst: DbContext { //使用自定义连接串 private static string GetEFConnctionString ...

  4. 第三节:EF Core上下文DbContext相关配置和生命周期

    一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...

  5. [EF]数据上下文该如何实例化?

    摘要 之前使用过一段Nhibernate,最近在尝试EF做项目,但对DbContext的实例化,有点困惑,发现和Nhibernate有不同.这里将查找的例子,在这里列举一下. 资料 在EntityFr ...

  6. MVC下EF添加上下文

    这里我们用Code First方法创建数据库表.这个方法简单点说就是先创建Model再根据Model生成数据库表. 为了方便起见,这里用的数据库是Visual Studio自带的LocalDb. 数据 ...

  7. EF DbContext 并发执行时可能出现的问题

    现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...

  8. EF架构~为EF DbContext生成的实体添加注释(T5模板应用)(转载)

    转载地址:http://www.newlifex.com/showtopic-1072.aspx 最近新项目要用Entity Framework 6.x,但是我发现从数据库生成模型时没有生成字段的注释 ...

  9. EF DBContext中DbSet中Hashset添加对象后,DataGrid UI没有刷新的问题

    使用EF4/5添加数据库视图生成DBContext,如果数据表/对象之间有M-N对应关系,EF对自动添加引用类集合,是Hashset类型.由于不是ObservableCellection类型,在引用类 ...

随机推荐

  1. 批量文件重命名工具-极力推荐 advanced renamer

    http://www.advancedrenamer.com/  功能太强大了,自己慢慢探索吧.

  2. Android应用程序基础

    Android程序使用Java语言编写.Android开发套件把数据.资源文件和Java代码编译到一个.以.apk为后缀名的Android压缩包中.一个单独的apk文件中的所有代码被认为是一个andr ...

  3. Android5.0 Gallery2上编译Gallery模块出错

    Android5.0 Gallery2上编译Gallery模块出错 时间:2015-05-05 19:32:57      阅读:105      评论:0      收藏:0      [点我收藏+ ...

  4. activemq学习

    一.特性及优势 1.实现JMS1.1规范,支持J2EE1.4以上2.可运行于任何jvm和大部分web容器(ActiveMQ works great in any JVM)3.支持多种语言客户端(jav ...

  5. Android SharedPreferences存图片,转码解码图片

    保存图片  首先创建ByteArrayStream对象,然后用BitmapFactroy把图片加载进来,然后compress压缩图片到流,  然后toByteArray()就行了 public voi ...

  6. 修改smali文件,重打包,实现调用第三方SO文件

    Java代码: static{ // //loadlibary里 要把SO文件名的lib和后缀去掉.libfgma.so --> fgma System.loadLibrary("fg ...

  7. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

  8. POJ 3905 Perfect Election

    2-SAT 裸题,搞之 #include<cstdio> #include<cstring> #include<cmath> #include<stack&g ...

  9. Html基础详解

    HTML是(Hyper Text Mark-up Language)超文本标记语言,是因特网上应用最为广泛的一种网络传输协议,所有的www文件都必须要遵守这个标准.这样就可以让浏览器根据标记语言的规则 ...

  10. Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

    Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误:[2009-06- ...