原文链接:Connections and Models

本篇文章主要包括 Entity Framework  是如何选择数据库进行连接,以及我们如何去改变它的连接。无论是通过 Code First 还是 Entity Framework 设计器创建模型,都将在本篇的讨论之中。

一般情况下,一个 Entity Framework 应用程序,都会使用一个派生自 DbContext 的类,而使用这个类的时候,将会调用父类(DbContext)众多构造方法中的一个。DbContext 的构造方法将会处理以下内容:

  • 当前的上下文(Context)是如何连接数据库的,比如:选择哪一个连接字符串。
  • 当前的上下文是通过 Code First 来计算出模型,还是直接加载从 EF 设计器中创建的模型。
  • 其它一些附加的高级选项。

接下来的几段,将讲述 DbContext 几种构造函数的使用方式。

使用 Code First 的约定(Convention)来创建连接

如果你对你的应用没有做任何的配置,然后调用 DbContext 的无参构造函数,这将会使的 DbContext 以 Code First 的方式运行,并且将通过默认的约定来创建数据库连接。例如:

namespace Demo.EF
{
public class BloggingContext : DbContext
{
public BloggingContext()
// C# 会自动调用父类的无参构造函数
{
}
}
}

在上面的示例中,DbContext 将使用你数据上下文类(BloggingContext)的完全限定名(包括名称空间),即:Demo.EF.BloggingContext 来作为你数据库的名字,并以此创建一个连接字符串到 SQL Express 或 LocalDb,如果这两种数据库都安装了的话,默认将使用 SQL Express。

默认情况下,Visual Studio 2010 包含了 SQL Express,而 Visual Sutdio 2012 包含的是 LocalDb。在安装 Entity Framework 的过程中,EF 的 NuGet 包将会检测哪一种数据库类型是可用的,然后会更新配置文件来设定默认的数据库类型,以便 Code First 的默认约定来创建连接。如果 SQL Express 是可用的,则将会使用 SQL Express,否则将会使用 LocalDb 作为默认配置。如果配置文件中已经指定了默认连接的配置,则安装过程中不会作任何更新。

使用 Code First 的约定和特定数据库名来创建连接

如果你在你的应用里没有做任何其它的配置,然后调用了 DbContext 只含一个 String 类型的构造函数,这将会使得 DbContext 以 Code First 的方式运行,并将通过你传入的字符串作为数据库名来创建连接。例如:

namespace Demo.EF
{
public class BloggingContext : DbContext
{
public BloggingContext():
base("BloggingDatabase")
{
}
}
}

在这个示例中, DbContext 将使用“BloggingDatabase”作为数据库名,并使用 SQL Express 或 LocalDb 创建相应连接字符串,如果两者都安装了,则使用 SQL Express。

使用 Code First 并在 app.config/web.config 中指定连接字符串

你可以在你的 app.config 或 web.config 文件中指定一个连接字符串,例如:

  <configuration>
<connectionStrings>
<add name="BloggingCompactDatabase"
providerName="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Blogging.sdf"/>
</connectionStrings>
</configuration>

比起默认的自动选择 SQL Express 还是 LocalDb,这里非常简单明确的告诉了 DbContext,我们要使用的是 SQL Server Compact Edition 数据库。

如果连接字符串的名称和你的数据上下文类(也就是派生自 DbContext 的类)名相匹配(无论有没有名称空间),则调用该类无参构造函数时,DbContext 将使用这个连接字符串创建连接。如果连接字符串名和你的数据上下文类名不匹配,则你可以通过 Code First 方式传递连接字符串名给 DbContext 的构造函数,如下:

    public class BloggingContext : DbContext
{
public BloggingContext():
base("BloggingCompactDatabase")
{
}
}

除此之外,你可以使用“name=<connection string name>”的方式来传递给 DbContext 的构造函数,例如:

    public class BloggingContext : DbContext
{
public BloggingContext():
base("name=BloggingCompactDatabase")
{
}
}

这样我们就很明确的告诉了 DbContext,我们传递的是连接字符串的名称,不是数据库名。如果这个指定名称的连接字符串没能找到,则会抛出一个异常。

使用 Database/Model First 并在 app.config/web.config 中指定连接字符串

通过 EF 设计器创建模型的方式与 Code First 完全不同,在应用程序运行时无需像 Code First 那样通过代码生成模型。极具代表性的,就是在你的项目里会有一个 EDMX 文件。

EF 设计器会在你的 app.config 或 web.config 文件中加入 EF 的连接字符串,这个特别的连接字符串中定义了,如何从你的 EDMX 文件中找到相应信息。例如:

  <configuration>
<connectionStrings>
<add name="Northwind_Entities"
connectionString="metadata=res://*/Northwind.csdl|
res://*/Northwind.ssdl|
res://*/Northwind.msl;
provider=System.Data.SqlClient;
provider connection string=
&quot;Data Source=.\sqlexpress;
Initial Catalog=Northwind;
Integrated Security=True;
MultipleActiveResultSets=True&quot;"
providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>

EF 设计器会在自动生成的代码中传入连接字符的名称给 DbContext 的构造函数,例如:

    public class NorthwindContext : DbContext
{
public NorthwindContext()
: base("name=Northwind_Entities")
{
}
}

DbContext 将知道去加载已存在的模型(而不是像使用 Code First 那样去计算得出),因为这个连接字符串是 EF 特有的连接字符串,里面包含了模型文件的相应信息。

DbContext 的一些其它构造选项

DbContext 类还有一些其它的构造函数可供使用,这些构造函数可以用开开启一些更多的高级选项,其中一些如下:

  • 你可以通过 DbModelBuilder 类来构建 Code First 的模型,而无需去初始化一个 DbContext 的实例,当你需要实例化 DbContext 的时候,可以将 DbModelBuilder 所 Build 的 DbModel 进行 Compile 后(转换成 DbCompiledModel)传递给 DbContext 的一个构造函数。
  • 除了连接字符串名或数据库名,你传递的还可以是一个完整的连接字符串给 DbContext 的构造函数,默认情况下,这个连接字符串将使用 System.Data.SqlClient 作为 Provider,你可以通过实现 IConnectionFactory 接口,然后设置给 context.Database.DefaultConnectionFactory 来进行你自己的解析。
  • 你可以传递给 DbContext 构造函数一个已经存在的 DbConnection 实例,如果该 DbConnection 派生于 EntityConnection ,则会使用 EntityConnection 中特定的模型信息(而不是通过 Code First 模式计算);如果 DbConnection 派生于其它类型,如 SqlConnection,则会使用 Code First 模式。
  • 你可以传递给 DbContext 构造函数一个已经存在的 ObjectContext,以此来创建一个包裹了 ObjectContext 的 DbContext。这比较适用于一个用 ObjectContext 构建的应用,却想使用更多 DbContext 提供的高级功能。

【EF 译文系列】模型和数据库连接的更多相关文章

  1. 【EF 译文系列】重试执行策略的局限性(EF 版本至少为 6)

    原文链接:Limitations with Retrying Execution Strategies (EF6 onwards) 当使用重试执行策略的时候,大体有以下两种局限性: 不支持以流的方式进 ...

  2. 【EF 译文系列】韧性连接、重试(EF 版本至少为 6)

    原文链接:Connection Resiliency / Retry Logic (EF6 onwards) 一个应用程序的数据库连接,是非常容易受其它因素影响的,比如后端的异常或者不稳定的网络连接等 ...

  3. 【Basics of Entity Framework】【EF基础系列1】

    EF自己包括看视频,看MSDN零零散散的学了一点皮毛,这次打算系统学习一下EF.我将会使用VS2012来学习这个EF基础系列. 现在看看EF的历史吧: EF版本 相关版本特性介绍 EF3.5 基于数据 ...

  4. EF中的开放式并发(EF基础系列--28)

    好久没更新EF这个系列了,现在又重新开始. 这次学习,开放式并发.首先拿出数据库脚本: 说明一下,这个数据库脚本是之前的章节中稍作修改的: USE [SchoolDB] GO /****** Obje ...

  5. 9.翻译:EF基础系列---使用EF开发的方式有哪些?

    原文链接:http://www.entityframeworktutorial.net/choosing-development-approach-with-entity-framework.aspx ...

  6. 10.翻译:EF基础系列---EF中的持久性

    原文链接:http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx ...

  7. 1.翻译:EF基础系列--什么是Entity Framework?

    大家好,好久不见,EF系列之前落下了,还是打算重新整理一下. 先说说目前的打算:先简单了解一下EF基础系列-->然后就是EF 6 Code-First系列-->接着就是EF 6 DB-Fi ...

  8. 一个官翻教程集合:ASP.NET Core 和 EF Core 系列教程

    通过一个大学课程案例讲解了复杂实体的创建过程及讲解 1.ASP.NET Core 和 Entity Framework Core 系列教程——入门 (1 / 10) 2.ASP.NET Core 和 ...

  9. 人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]本文衔接上一个随笔:人工智能中小样本问题相关的系列模型演变及学习 ...

随机推荐

  1. GPUImage 内置滤镜解析

    #pragmamark - 调整颜色 Handle Color GPUImageBrightnessFilter //亮度GPUImageExposureFilter //曝光GPUImageCont ...

  2. chm格式文件能打开,但看不到内容问题

    是chm格式的能打开文件,也能看到左边的目录信息,但是无法显示右面的具体内容.报错:无法显示网页.错误页面的url是:res://C:WINDOWSsystem32shdoclc.dll/dnserr ...

  3. 关于DDD的 认识

    tks: 第一篇: 领域驱动设计系列(1)通过现实例子显示领域驱动设计的威力 第二篇: 领域驱动设计系列(2)浅析VO.DTO.DO.PO的概念.区别和用处 第三篇: 领域驱动设计系列(3)有选择性的 ...

  4. (原)win8下编译GLUT

    1.到opengl官网下载glut源代码 2.修改glutwin32.mak下 # MSVC install directoriesLIBINSTALL     = XXXXX\VC\lib //vs ...

  5. css3实现进度条的模拟

    两种进度条动画的实现: 1.css3,但IE9-不支持. 2.js动画,兼容性好,但没有css3实现的顺畅 Demo: <html>    <head>        < ...

  6. 使用IntelliJ IDEA 14和Maven创建java web项目

    参考地址 http://www.cnblogs.com/jifeng/p/4658765.html

  7. WordPress博客搬家注意事项

    博客域名还有一段时间就到期了,准备更换域名和空间,会出现一些问题,我这里在网上收集整理了一下,基本上会遇到两个重要的问题. 首先第一个问题就是数据的搬迁中出现的错误. 我这里用的是phpmyadmin ...

  8. IOS 使用SDWebImage实现仿新浪微博照片浏览器

    使用第三方库SDWebImage实现仿新浪微博照片浏览器,可以下载图片缓存,点击之后滚动查看相片,具体效果如下: 代码如下: WeiboImageView.h: #import <UIKit/U ...

  9. php 设计模式 - 单例

    概述: 作为对象的创建模式,单例确保某一个内在系统中只存在一个实例,它不可以创建副本. 克隆函数(__clone )以及构造函数(__construct )必须声明为私用, 防止外部程序 创建一个新类 ...

  10. 让C程序更高效的10种方法(转)

    原文:http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一 ...