zoukankan      html  css  js  c++  java
  • Entity Framework Context上下文管理(CallContext 数据槽)

    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(1);
                Console.WriteLine(item.customerName);
    
                Console.ReadKey();
            }
        }
    
        public class Test1
        {
            public void Add()
            {
                DbContext context = CallContextFactory.GetContext();
                var item = context.Set<CustomerInfo>().Find(1);
                item.customerName += "1";
            }
        }
    
        public class Test2
        {
            public void Add()
            {
                DbContext context = CallContextFactory.GetContext();
                var item = context.Set<CustomerInfo>().Find(1);
                item.customerName += "2";
            }
        }
    }

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

  • 相关阅读:
    关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)
    在Windows上安装MySQL(免安装ZIP版)
    Linux下解决中文乱码问题
    VMware安装VMware Tools
    (RHEL)Linux下的oracle(11g R2)安装过程
    每天学一点Python
    简单的Datatable转List,Json
    C# 刷票程序
    一些顿悟,和新的开始!
    每天学一点Python(2)
  • 原文地址:https://www.cnblogs.com/DrHao/p/5368602.html
Copyright © 2011-2022 走看看