一、概述
本文将介绍如何使用数据库连接及如何更改数据库连接。使用Code First和EF设计器创建的模型在本文中都会说明。
通常,实体框架应用程序使用派生自DbContext
的类。此派生类将调用基础DbContext
类上的构造函数之一来控制:
- 上下文如何连接到数据库 - 即如何找到/使用连接字符串。
- 上下文是使用 Code First 计算模型还是加载使用 EF 设计器创建的模型、
二、使用 Code First 按约定创建连接
如果尚未在应用程序中进行任何其他配置,那么,调用 DbContext 上的无参数构造函数将导致 DbContext 以 Code First 模式运行,并按约定创建数据库连接。 例如:
namespace Common.EF { public class BloggingContext : DbContext { public BloggingContext() { } } }
在此示例中,DbContext 使用派生上下文类的命名空间限定名称 (Demo.EF.BloggingContext) 作为数据库名称,并使用 SQL Express 或 LocalDB 为该数据库创建连接字符串。 如果两者均已安装,则使用 SQL Express。
三、使用 Code First 和指定的数据库名称按约定创建连接
如果尚未在应用程序中进行任何其他配置,通过要使用的数据库名称调用 DbContext 上的字符串构造函数将导致 DbContext 以 Code First 模式运行,并按约定与具有该名称的数据库建立连接。 例如:
public class BloggingContext : DbContext { public BloggingContext() : base("BloggingDatabase") { } }
DbContext 使用“BloggingDatabase”作为数据库名称,并使用 SQL Express(随 Visual Studio 2010 安装)或 LocalDB(随 Visual Studio 2012 安装)为该数据库创建连接字符串。 如果两者均已安装,则使用 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>
这是告诉 DbContext 使用 SQL Express 或 LocalDB 以外的数据库服务器的一种简单方法 - 上面的示例指定了 SQL Server Compact Edition 数据库。
如果连接字符串的名称与上下文的名称匹配(带或不带命名空间限定),那么当使用无参数构造函数时,DbContext 将找到它。 如果连接字符串名称与上下文名称不同,则可以通过将连接字符串名称传递给 DbContext 构造函数,告诉 DbContext 在 Code First 模式下使用此连接。 例如:
public class BloggingContext : DbContext { public BloggingContext() : base("BloggingCompactDatabase") { } }
或者,可以对传递给 DbContext 构造函数的字符串使用格式“name=”。 例如:
public class BloggingContext : DbContext { public BloggingContext() : base("name=BloggingCompactDatabase") { } }
此格式明确表示你希望在配置文件中找到连接字符串。 如果未找到具有给定名称的连接字符串,则会引发异常。
五、将 Database/Model First 与 app.config/web.config 文件中的连接字符串结合使用
使用 EF 设计器创建的模型与 Code First 的不同之处在于,模型已经存在并且不是在应用程序运行时通过代码生成的。 该模型通常作为项目中的 EDMX 文件存在。
设计器会将 EF 连接字符串添加到 app.config 或 web.config 文件中。 此连接字符串的特殊之处在于,它包含有关如何在 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= "Data Source=.\sqlexpress; Initial Catalog=Northwind; Integrated Security=True; MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/> </connectionStrings> </configuration>
EF 设计器还将生成代码,以通过将连接字符串名称传递给 DbContext 构造函数来告诉 DbContext 使用此连接。
public class NorthwindContext : DbContext { public NorthwindContext() : base("name=Northwind_Entities") { } }
DbContext 知道要加载现有模型(而不是使用 Code First 通过代码计算它),因为该连接字符串是一个 EF 连接字符串,其中包含要使用的模型的详细信息。
六、总结
DbContext 类包含其他构造函数和使用模式,可以实现一些更高级的方案。 其中一些功能包括:
- 你可以使用 DbModelBuilder 类生成 Code First 模型,而无需实例化 DbContext 实例。 此操作将生成一个 DbModel 对象。 然后,当你准备好创建 DbContext 实例时,可以将此 DbModel 对象传递给 DbContext 构造函数之一。
- 你可以将完整的连接字符串传递给 DbContext,而不只是传递数据库或连接字符串名称。 默认情况下,此连接字符串与 System.Data.SqlClient 提供程序一起使用;可以通过在 context.Database.DefaultConnectionFactory 上设置不同的 IConnectionFactory 实现来更改此行为。
- 你可以通过将现有 DbConnection 对象传递给 DbContext 构造函数来使用它。 如果连接对象是 EntityConnection 的实例,则将使用连接中指定的模型,而不是使用 Code First 计算模型。 如果对象是某种其他类型的实例(例如,SqlConnection),上下文会将其用于 Code First 模式。
- 你可以将现有 ObjectContext 传递给 DbContext 构造函数,以创建包装现有上下文的 DbContext。 这可用于使用 ObjectContext 但希望在应用程序的某些部分利用 DbContext 的现有应用程序。