Context上下文管理

Q1:脏数据

Q2:一次逻辑操作中,会多次访问数据库,增加了数据库服务器的压力

>在一次逻辑操作中实现上下文实例唯一

方法一:单例模式:内存的爆炸式增长

    在整个运行期间是静态的,保持加载对象不会被回收,所有跟踪的对象也都不会被回收

方式二:CallContext(线程数据槽):

    1:线程独享的数据槽。2:集合结构 (web也可以使用HttpContext)

CallContext 类 (System.Runtime.Remoting.Messaging)_files 链接: http://pan.baidu.com/s/1c2LRbmo  密码: 52zp

对比使用EF与ADO.NET

优点:开发简单快捷,强大的模型设计,跨数据库支持

缺点:效率低(把EF操作转换为SQL语句)

1:使用EntityFramework Database First方式创建CustomerInfo表格数据映射

Entity Framework(EF的Database First方法) :http://www.cnblogs.com/Dr-Hao/p/5367147.html

2:新建ContextFactory.cs封装工厂类

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks; namespace CallContextTest
{
public class CallContextFactory
{
public static DbContext GetContext()
{
//通过CallContext数据槽,可以实现线程类实例唯一的功能
DbContext context = CallContext.GetData("context") as DbContext;
if (context==null)
{
context = new MyFirstEFEntities();
CallContext.SetData("context",context);
}
//每次都新建上下文对象,在一次逻辑操作中,无法保证数据的正确性
//DbContext context = new MyFirstEFEntities();
return context;
}
}
}

3:Program.cs 程序中的测试代码

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CallContextTest
{
class Program
{
static void Main(string[] args)
{
Test1 test1 = new Test1();
test1.Add();
Test2 test2 = new Test2();
test2.Add(); DbContext context = CallContextFactory.GetContext();
var item = context.Set<CustomerInfo>().Find();
Console.WriteLine(item.customerName); Console.ReadKey();
}
} public class Test1
{
public void Add()
{
DbContext context = CallContextFactory.GetContext();
var item = context.Set<CustomerInfo>().Find();
item.customerName += "";
}
} public class Test2
{
public void Add()
{
DbContext context = CallContextFactory.GetContext();
var item = context.Set<CustomerInfo>().Find();
item.customerName += "";
}
}
}

最后输出结果为 item.customerName+"12"; 这样在一次逻辑操作中,通过CallContext数据槽,可以实现线程类实例唯一的功能,保证数据的正确性。

Entity Framework Context上下文管理(CallContext 数据槽)的更多相关文章

  1. Entity Framework一对多关系添加数据的两种方式

    当使用Entity Framework添加一对多关系数据的时候,通常先添加一的数据,然后再添加多的数据.类似这样: //添加一的数据 var category = new Category{Name= ...

  2. Entity Framework context per request

    原文发布时间为:2011-09-24 -- 来源于本人的百度文章 [由搬家工具导入] http://www.blog.cyberkinetx.com/2011/05/15/entity-framewo ...

  3. Entity Framework(六):数据迁移

    在前面的几篇文章中,简单的介绍了如何使用Entity Framework的Code First模式创建数据库,但是,在前面的几篇文章中,我们都是通过使用数据库初始化策略来做,也就是每次先删除数据库然后 ...

  4. Entity Framework 5.0系列之数据操作

    Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...

  5. Entity Framework Code First实体关联数据加载

    在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...

  6. Entity Framework 程序设计入门二 对数据进行CRUD操作和查询

    前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...

  7. Entity Framework应用:管理并发

    理解并发 并发管理解决的是允许多个实体同时更新,实际上这意味着允许多个用户同时在相同的数据上执行多个数据库操作.并发是在一个数据库上管理多个操作的一种方式,同时遵守了数据库操作的ACID属性(原子性. ...

  8. Entity Framework 之Code First自动数据迁移

    using MvcShopping.Migrations; using MvcShopping.Models; using System; using System.Collections.Gener ...

  9. Entity Framework Code First Migrations--EF 的数据迁移

    1. 为了演示方便,首先新建一个控制台项目,然后添加对entityframework的引用 使用nuget控制台执行: Install-Package EntityFramework 2.新建一个实体 ...

随机推荐

  1. PHP中的PEAR是什么?

    PEAR也就是为PHP扩展与应用库(PHP Extension and Application Repository),它是一个PHP扩展及应用的一个代码仓库. 补充:php中扩展pecl与pear ...

  2. 使用userData兼容IE6-10,chrome,FF 及360等浏览器的本地存储

    开发过程中涉及本地存储的使用,IE很多版本都不支持localStorage,没办法,就得兼容使用userData了.废话不说了,看代码: (function(window){var LS;(funct ...

  3. 使用regsrv32.exe绕过应用程序白名单(多种方法)

    0x00 regsvr简介 regsvr32表示Microsoft注册服务.它是Windows的命令行实用工具.虽然regsvr32有时会导致问题出现,但它是Windows系统文件中的一个重要文件.该 ...

  4. C++ explicit constructor/copy constructor note

    C++:explict 作用显示声明构造函数只能被显示调用从而阻止编译器的隐式转换,类似只能用()显示调用,而不能=或者隐式调用 #include <iostream> #include ...

  5. CSS边框及常用样式

    一.CSS设置样式 1.1 边框border 作用:设置标签周围的边框,方法  board:宽度 样式 颜色,一般情况下样式使用 solid实体的,和dotted虚线的 <head> &l ...

  6. IntelliJIDEA永久注册使用

    1. 首先下载本地IntelliJIDEA注册服务机(没有密码哦) http://pan.baidu.com/s/1hsyZp0C 2.解压后进入解压的文件夹,找到自己操作系统对应的版本,我这里使用 ...

  7. Cloudstack 虚拟机实例(四)

    虚拟机实例 默认的模板并没有被下载 修改全局设置  secstorage.allowed.internal.sites 设置 ,二级存储ISO镜像和模板可以下载,IP网段 重启服务/etc/init. ...

  8. Hadoop部署方式-完全分布式(Fully-Distributed Mode)

    Hadoop部署方式-完全分布式(Fully-Distributed Mode) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本博客搭建的虚拟机是伪分布式环境(https://w ...

  9. oracle改进之将阿拉伯数字转换成中文数字

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处   http://www.cnblogs.com/king-xg/p/6839738.html 将阿拉伯数字转 ...

  10. Spring 手动提交事务

    在使用Spring声明式事务时,不需要手动的开启事务和关闭事务,但是对于一些场景则需要开发人员手动的提交事务,比如说一个操作中需要处理大量的数据库更改,可以将大量的数据库更改分批的提交,又比如一次事务 ...