这章主要讲怎么配置DbContext的子类访问的数据库的位置。

我相信大家最经常使用的数据库位置的配置方式就是配置文件了,也就是通过App.Config 或Web.Config来配置要访问的数据库。

我们可以再配置文件里添加一个连接字符串的配置来定义数据库的位置

<connectionStrings>
        <add name="OrderSystemContext" connectionString="Data Source=XXX\SQL2008R2;Initial Catalog=OrderSystem;User Id=XXX;Password=XXX" providerName="System.Data.SqlClient"/>
    </connectionStrings>

那么怎么样Code First知道使用哪个连接字符串来找到要访问的数据库呢?

默认情况下,DbContext 会找继承上下文子类的同名的连接字符串。

有一个简单的方式,如果你想使用固定的连接字符串的名字而不是通过参数把名字传进来,可以直接在默认构造函数中调用基类的构造函数,传入固定的连接字符串名称:

public OrderSystemContext()
            :base("OrderSystem")
        {

}

如果我们程序中同时存在多个DbContext的子类的时候,Entity Framework会为每个DbContext的子类都创建一个数据库连接,那么我们的程序就保留了很多个数据库连接的实例。如果我们要优化我们的程序,就可以让多个DbContext子类使用同一个数据库连接实例。我们还是要通过重载DbContext的另一个构造函数来实现这个功能。

public OrderSystemContext(DbConnection connection, bool contextOwnsConnection)

: base(connection, contextOwnsConnection) 
        { 
        }

这个构造函数有两个参数,第一个是我们共用的上下文实例,第二个参数是个开关,用于控制是否由当前的DbContext子类控制数据库连接实例。

如果contextOwnsContext属性为true,那么当DbContext子类Dispose的时候,就会把共用的DbConnection实例也Dispose掉。如果这个值是false,则数据库连接实例就需要由程序员自己写程序释放。

string connectionString = @"Data Source=XXX\SQL2008R2;Initial Catalog=OrderSystem;User Id=XXX;Password=XXX";

SqlConnection conn = new SqlConnection(connectionString);
 OrderSystemContext unitOfWork = new OrderSystemContext(conn,true);
 ProductRepository repository = new ProductRepository(unitOfWork);
 ProductCatalog catalog = repository.SearchProductCatalog(c => c.CatalogName == "DELL E6400", 1, 10)[0];
 Product product = new Product { Catalog = catalog, CreateDate = DateTime.Parse("2010-2-10"), ExpireDate = DateTime.Parse("2012-2-10") };
 repository.AddNewProduct(product);

unitOfWork.CommitChanges();

EF会通过一个实现了IDbConnectionFactory接口的类为我们自定义的DbContext类创建数据库连接。Entity Framework默认提供一个SqlConnectionFactory类用来创建SQL Server的数据库连接。Entity Framework Code First中Database.DefaultConnectionFactory属性存储就是SqlConnectionFactory的对象。

你可以初始化一个新的SqlConnectionFactory的实例,把它赋给Database.DefaultConnectionFactory属性,你还可以在初始化SqlConnectionFactory的时候,将一些数据库配置传进去覆盖Code First的默认数据库连接配置。

Code First04---关于上下文DbContext的更多相关文章

  1. 在EntityFramework6中管理DbContext的正确方式——3环境上下文DbContext vs 显式DbContext vs 注入DbContext(外文翻译)

    (译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...

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

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

  3. 使用 AHK 在 VS Code 中根据上下文自动切换输入法状态

    平常在VS Code打公式,中英文切换一直狂点 Shift 手都快按断了,于是试图用 AutoHotKey 搞一些自动切换输入法程序,让它根据当前输入环境自动切输入法. 之前在网上搜到的是切换键盘的( ...

  4. EF dbcontext上下文的处理

    ,那么我们整个项目里面上下文的实例会有很多个,我们又遇到了多次,当我们在编程的时候遇到多的时候,一般我们就要想想能不能解决多这个问题. (2)这里我要说的是EF上下文怎么管理呢?很简单啦,就是要保证线 ...

  5. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  6. 初试Code First(附Demo)

    写在前面 新建项目 安装EntityFramework程序包 创建模型 创建上下文DbContext 创建数据库.读/写数据 配置连接字符串 Code First 迁移 示例Demo下载 后记 以前逛 ...

  7. Code First :使用Entity. Framework编程(7) ----转发 收藏

    第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...

  8. 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...

  9. Code First 启用迁移时出错 "No context type was found in the assembly"

    问题:Code First 启用迁移时找不到上下文DbContext所在的项目. PM> Enable-Migrations No context type was found in the a ...

随机推荐

  1. 北京地铁站点遍历最少经站次数问题普遍意义上是一个NP问题,目前不存在多项式时间算法能够解决该问题

    http://www.cnblogs.com/jiel/p/5852591.html 众所周知求一个图的哈密顿回路是一个NPC问题: In the mathematical field of grap ...

  2. Python基本数据类型之str

    一.创建 s = "morra" s = str("morra") #str()这种方法会自动找到str类里的_init_方法去执行 ------------- ...

  3. Mobius 反演

    上次看莫比乌斯繁衍反演是一个月前,讲道理没怎么看懂.. 然后出去跪了二十天, 然后今天又开始看发现其实并不难理解   开个这个仅记录一下写过的题. HAOI 2011 B   这应该是莫比乌斯反演的模 ...

  4. NSRunLoop && NSTimer

    新的一年的开始,希望大家一切越来越好,越来越开心快乐!!! 定时器及运行循环 NSRunLoop是iOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在 ...

  5. mysql数据库添加索引优化查询效率

    项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `t ...

  6. C# WinForm中将Form显示在Panel中(C#)

    信息来自:http://blog.csdn.net/renyouprince/article/details/4136176 当我们在做WinForm的程序时,总是要弹出一些窗体,但弹出窗体看起来效果 ...

  7. Mongodb的Samus驱动

    最近开始学习Mongodb方面的东西.. 看到有很多博主都说MongoDB的第三方驱动 Samus 对Linq的支持比较好..能够降低学习的成本..所以就想从这里开始.. 但是弊端在我学习了一半的时候 ...

  8. css3d总结

    3d舞台 设置 perspective(景深): length, 可以设置overflow:hidden 3d舞台下 -> 3d元素容器  设置 transform-style: preserv ...

  9. 关于http请求

    response的Head值:  200 : 请求已成功,请求所希望的响应头或数据体将随此响应返回  304 : Not Modified 客户端有缓冲的文档并发出了一个条件性的请求,原来缓冲的文档还 ...

  10. Redis3.0.7 cluster/集群 安装配置教程

    1.前言 环境:CentOS-6.7-i386-LiveDVD 安装的CentOs系统 节点: 6个节点,3个主节点.3个从节点(由于redis默认需要3个主节点,如果想每个主节点有一个从节点,这是最 ...