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类型,在引用类 ...
随机推荐
- Problem H: 小火山的围棋梦想 多校训练2(小火山专场)
题目链接:http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1908 题意:如果'.'被'*'围起来,就把'.'变为'*'. 分析:如果是'*'直接输出, ...
- ubuntu 12.04 安装snort acidbase相关注意事项
一.安装Snort 1.安装libpcap 1 apt-get install libpcap-dev 2.安装snort 1 2 apt-get install snort apt-get inst ...
- script 两则
script1: PATH=/usr/local/bin:/usr/bin:$PATH:. . $HOME/utility/macro/macro.env OVO_DIR=/tmp LOGFILE=$ ...
- List和ArrayList之间转换的例子
package Test01; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public c ...
- 强制设置IE浏览器的版本模式
转载自:http://blog.csdn.net/huwenhu2007/article/details/17954119 1.<meta http-equiv="X-UA-Compa ...
- C语言实现md5函数代码
网上找到的实现md5函数代码,包括一个头文件md5.h和一个源文件md5.c,用下面的测试代码test.c测试通过,各文件依次如下: 头文件md5.h #ifndef MD5_H #define MD ...
- (转)StringTokenizer类的使用
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...
- zencart侧边导航点击一级目录展开二级目录
[小 大] 2013-09-17 00:20 来源: 未知 作者:wtozz_admin 我要投稿 zencart侧边导航点击一级目录展开二级目录 zen cart Categories默认的是只显示 ...
- 关于flex4 list 高度适应内容
Flex 4: Setting Spark List height to its content height How to set a Spark List height to the height ...
- ural1890 Money out of Thin Air
Money out of Thin Air Time limit: 1.0 secondMemory limit: 64 MB Each employee of the company Oceanic ...