配置文件设置
实体框架允许在配置文件中指定多个设置。 一般来说,EF 遵循“约定优于配置”的原则:本文中讨论的所有设置都有一个默认行为,你只需考虑在默认设置不再满足你的要求时更改设置。
配置数据指南
- 请勿在配置提供程序代码或纯文本配置文件中存储密码或其他敏感数据。
- 不要在开发或测试环境中使用生产机密。
- 请在项目外部指定机密,避免将其意外提交到源代码存储库。
- 请考虑使用 受保护的配置保护配置文件的内容。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
基于代码的替代方案
也可以使用代码应用所有这些设置。 从 EF6 开始,我们引入了基于代码的配置,它提供了一种从代码应用配置的重要方式。 在 EF6 之前,仍然可以从代码应用配置,但需要使用各种 API 来配置不同的区域。 借助配置文件选项可在部署期间轻松更改这些设置,而无需更新代码。
实体框架配置部分
从 EF4.1 开始,可以使用配置文件的 appSettings 部分为上下文设置数据库初始值设定项。 在 EF 4.3 中,我们引入了自定义 entityFramework 部分来处理新设置。 实体框架仍将识别使用旧格式设置的数据库初始值设定项,但建议尽可能改用新格式。
安装 EntityFramework NuGet 包时,entityFramework 部分会自动添加到项目的配置文件中。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
</configuration>
连接字符串
此页提供了有关实体框架如何确定要使用的数据库的更多详细信息,包括配置文件中的连接字符串。
连接字符串位于标准 connectionStrings 元素中,不需要 entityFramework 部分。
基于 Code First 的模型使用常规 ADO.NET 连接字符串。 例如:
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>
基于 EF 设计器的模型使用特殊的 EF 连接字符串。 例如:
<connectionStrings>
<add name="BlogContext"
connectionString=
"metadata=
res://*/BloggingModel.csdl|
res://*/BloggingModel.ssdl|
res://*/BloggingModel.msl;
provider=System.Data.SqlClient;
provider connection string=
"data source=(localdb)\mssqllocaldb;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
providerName="System.Data.EntityClient" />
</connectionStrings>
基于代码的配置类型(EF6 以上版本)
从 EF6 开始,可以为 EF 指定 DbConfiguration,以用于应用程序中基于代码的配置。 在大多数情况下,无需指定此设置,因为 EF 会自动发现 DbConfiguration。 有关何时可能需要在配置文件中指定 DbConfiguration 的详细信息,请参阅基于代码的配置的移动 DbConfiguration 部分。
若要设置 DbConfiguration 类型,请在 codeConfigurationType 元素中指定程序集限定类型名称。
注意
程序集限定名称是命名空间限定名称,后跟逗号,然后是类型所在的程序集。 还可以选择指定程序集版本、区域性和公钥标记。
<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>
EF 数据库提供程序(EF6 以上版本)
在 EF6 之前,数据库提供程序的特定于实体框架的部分必须作为核心 ADO.NET 提供程序的一部分包含在内。 从 EF6 开始,EF 特定部分现在单独管理和注册。
通常无需自行注册提供程序。 此操作通常会在安装时由提供程序完成。
通过在 entityFramework 部分的 providers 子部分下包含 provider 元素来注册提供程序。 提供程序条目有两个必需的属性:
- invariantName,标识此 EF 提供程序面向的核心 ADO.NET 提供程序
- type,是 EF 提供程序实现的程序集限定类型名称
注意
程序集限定名称是命名空间限定名称,后跟逗号,然后是类型所在的程序集。 还可以选择指定程序集版本、区域性和公钥标记。
此处的示例是在安装实体框架时为注册默认 SQL Server 提供程序而创建的条目。
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
侦听器(EF6.1 以上版本)
从 EF6.1 开始,可以在配置文件中注册侦听器。 通过侦听器可在 EF 执行某些操作(例如执行数据库查询、打开连接等)时运行其他逻辑。
通过在 entityFramework 部分的 interceptors 子部分下包含 interceptor 元素来注册侦听器。 例如,以下配置注册了内置的 DatabaseLogger 侦听器,该侦听器将所有数据库操作记录到控制台。
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>
将数据库操作记录到文件(EF6.1 以上版本)
如果要将日志记录添加到现有的应用程序以帮助调试问题,则通过配置文件注册侦听器特别有用。 DatabaseLogger 通过提供文件名作为构造函数参数来支持记录到文件。
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:\Temp\LogOutput.txt"/>
</parameters>
</interceptor>
</interceptors>
默认情况下,这将导致每次应用启动时日志文件都被一个新文件覆盖。 要改为附加到日志文件(如果它已经存在),请使用以下操作:
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:\Temp\LogOutput.txt"/>
<parameter value="true" type="System.Boolean"/>
</parameters>
</interceptor>
</interceptors>
有关 DatabaseLogger 和注册侦听器的其他信息,请参阅博客文章 EF 6.1:无需重新编译即可启用日志记录。
Code First 默认连接工厂
配置部分允许你指定 Code First 应该使用的默认连接工厂来定位要用于上下文的数据库。 仅当未将连接字符串添加到上下文的配置文件时,才使用默认连接工厂。
安装 EF NuGet 包时,会注册一个指向 SQL Express 或 LocalDB 的默认连接工厂,具体取决于你安装的连接工厂。
若要设置连接工厂,请在 defaultConnectionFactory 元素中指定程序集限定类型名称。
注意
程序集限定名称是命名空间限定名称,后跟逗号,然后是类型所在的程序集。 还可以选择指定程序集版本、区域性和公钥标记。
以下是设置自己的默认连接工厂的示例:
<entityFramework>
<defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>
上面的示例要求自定义工厂具有无参数构造函数。 如果需要,可以使用 parameters 元素指定构造函数参数。
例如,包含在实体框架中的 SqlCeConnectionFactory 需要你向构造函数提供一个提供程序固定名称。 提供程序固定名称标识要使用的 SQL Compact 版本。 以下配置将导致上下文默认使用 SQL Compact 4.0 版。
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
如果未设置默认连接工厂,Code First 将使用指向 .\SQLEXPRESS
的 SqlConnectionFactory。 SqlConnectionFactory 也有一个构造函数,允许你重写连接字符串的各个部分。 如果要使用 .\SQLEXPRESS
以外的 SQL Server 实例,可以使用此构造函数来设置服务器。
以下配置将导致 Code First 将 MyDatabaseServer 用于未设置显式连接字符串的上下文。
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
默认情况下,假定构造函数参数的类型为字符串。 可以使用 type 特性进行更改。
<parameter value="2" type="System.Int32" />
数据库初始值设定项
数据库初始值设定项按上下文进行配置。 可以使用 context 元素在配置文件中设置它们。 此元素使用程序集限定名称标识要配置的上下文。
默认情况下,Code First 上下文配置为使用 CreateDatabaseIfNotExists 初始值设定项。 context 元素上有一个 disableDatabaseInitialization 属性,可用于禁用数据库初始化。
例如,以下配置禁用 MyAssembly.dll 中定义的 Blogging.BlogContext 上下文的数据库初始化。
<contexts>
<context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>
可以使用 databaseInitializer 元素设置自定义初始值设定项。
<contexts>
<context type=" Blogging.BlogContext, MyAssembly">
<databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
</context>
</contexts>
构造函数参数使用与默认连接工厂相同的语法。
<contexts>
<context type=" Blogging.BlogContext, MyAssembly">
<databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
<parameters>
<parameter value="MyConstructorParameter" />
</parameters>
</databaseInitializer>
</context>
</contexts>
可以配置实体框架中包含的泛型数据库初始值设定项之一。 type 属性将 .NET Framework 格式用于泛型类型。
例如,如果使用的是 Code First 迁移,则可以使用 MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
初始值设定项将数据库配置为自动迁移。
<contexts>
<context type="Blogging.BlogContext, MyAssembly">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
</context>
</contexts>