这章主要讲怎么配置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. linux 驱动入门4

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境.http://www.cnblogs.com/nan-jing/articles/5806399.html上文提到了如何创建proc节 ...

  2. MooseFs-分布式文件系统系列(三)之MFSclient端的使用

    Web界面监控MFS状态 mfscgiserv 是用python写的一个web服务器,监听端口是9425,必须在master(管理服务器上)上启动 常用的参数如下: | 参数| 作用| |:--| : ...

  3. Linux修改oracle 10g的字符集

    修改数据库字符集为:ZHS16GBK查看服务器端字符集SQL > select * from V$NLS_PARAMETERS修改:$sqlplus /nologSQL>conn / as ...

  4. Java数据结构——双端链表

    //================================================= // File Name : FirstLastList_demo //------------ ...

  5. activity栈的关系

    android:intent flags 一.Activity和Task(栈)的关系 Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面, ...

  6. TortoiseSVN的相关问题

    图标覆盖问题: 创建一个保存文档的目录,创建一个工作目录,工作目录创建后,没有显示覆盖图标.解决办法如下: 找到设置,在工作目录下右键 打开界面如下: 从包含路径中设置就可以. 目录检出后把它从检出状 ...

  7. HTML5 常用的结构化标签整理

    一.语义化结构化标签 结构化标签优点: 1.方便浏览器处理和识别,提升了网页的质量和语义. 2.减少了大量无意义的div标签,增强代码的可读性. 结构化标签:(header,nav,body,arti ...

  8. MySQL出错:ERROR 1045 (28000)的解决方法

    MySQL突然不能用了,症状如下: [root@bogon ok]# mysql ERROR (): Access denied for user 'root'@'localhost' (using ...

  9. 在 docker中 运行 mono /jexus server 并部署asp.net mvc站点

    http://linuxdot.net/bbsfile-3988 1.  安装 docker:      // docker 1.7 新版 安装非常容易,理论上说,在主流的任意linux发行版上都可以 ...

  10. CMD窗口如何调整大小 / 颜色

    Windows默认的命令行工具CMD暴丑无比..很多人都会因为这个原因去寻找漂亮的命令行工具.. 但是很多所谓的命令行工具并不能完美的支持到CMD.. 譬如 PowerCMD 或 Cmder 之流.. ...