EntityFramework—配置⽂件设置
可以使⽤配置⽂件或代码(EF6起)配置EF框架。
⼀、使⽤配置⽂件
安装Entity Framewo熊猫图片
rk⾃动⽣成的配置
当使⽤VS的NuGet⾃动安装Entity Framework(本⽂使⽤6.2.0)时会⾃动⽣成⼀些代码。在fig中会⾃动添加⼀些配置
⼀个空的配置⽂件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku="Framework,Version=v4.5.1" />
</startup>
</configuration>
安装Enti墨鱼丸子
ty Framework后配置⽂件变为:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit /fwlink/?LinkID=237468 -->
<ction name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, P </configSections>
<startup>
<supportedRuntime version="v4.0" sku="Framework,Version=v4.5.1离析是什么意思
" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration&g电话的简笔画
t;
可以看到增加了<configSections>、&l高中排列组合公式
t;entityFramework>配置节,这些配置都是针对微软SqlServer数据库的,如果使⽤其他数据库还有
修改⼀下。
如果将<configSections>配置节删掉,运⾏程序会抛异常,异常抛出的位置为DbContext初始化的时候。
所以<configSections>配置节是必须的,其作⽤是创建⾃定义配置节,配置EF框架。默认⽣成的⾃定义配置节名称为entityFramework,所以下⾯的<entityFramework>也是必须的。
⾃动⽣成的<entityFramework>配置节中包含了<defaultConnectionFactory>、<providers>这两个配置节。其实只包含<providers>配置节就可以了且是必须的。
<defaultConnectionFactory>配置节的作⽤是配置code first默认连接⼯⼚。此配置节下的<parameters>⽤来指定连接⼯⼚构造函数的参数,如果参数是多个可以配置多个。
<providers> 配置节的作⽤是指定访问数据库的客户端dll(EF6起)。
⾃此默认的配置解析完了,接下来是⾮⾃动⽣成的配置。
需⼿动配置的部分
<connectionStrings>配置节⽤于配置数据库连接字符串,是必须配置的(⼀定程度上,若不配置则要显⽰传递数据库连接给上下⽂)。
<entityFramework>下的<contexts> 配置节是选配的,作⽤是配置⾃定义数据库上下⽂,完成数据库初始化。
<entityFramework>下的<interceptors>配置节配置拦截器(EF6.1起)。
例:
<interceptors>
<interceptor type="XXXX, XX">
<parameters>
<parameter value="param"/>
</parameters>
</interceptor>
</interceptors>
<interceptor>的type逗号前是类名(含命名空间),逗号后是命名空间,<parameters> 配置节配置类构造函数的参数。
<entityFramework>的属性codeConfigurationType配置数据库连接配置,必选。如果连接配置是⾃定义的扩展⾃DbConfiguration的类,那么要配置这个⾃定义类。
⼆、使⽤代码完成配置
使⽤代码完成配置要做到以下⼏项
1)创建System.Data.Entity.DbConfiguration类的⼦类
2)在⼦类构造函数中调⽤DbConfiguration的⽅法进⾏配置。
3) 将继承⾃DbConfiguration的⼦类传给DbConfigurationType特性,启⽤配置
DbConfiguration中的⽅法
protected internal void SetDefaultConnectionFactory(IDbConnectionFactory connectionFactory);
设置数据库连接⼯⼚,对应<defaultConnectionFactory>配置节
protected internal void AddInterceptor(IDbInterceptor in天秤女天蝎男
terceptor);
设置数据库拦截器,对应<interceptor>配置节
protected internal void SetExecutionStrategy(string providerInvariantName, Func<IDbExecutionStrategy>
getExecutionStrategy);
设置访问数据库的客户端dll,对应<provider>配置节
三、⽰例(EF6.0.0)
以MySql为例说明只使⽤配置⽂件、只使⽤编码⽅式、使⽤配置⽂件和编码结合的⽅式完成配置。
EF操作MySql涉及到两个dll:MySql.Data.Entity,MySql.Data.Entity.EF6.dll(适⽤于 Framework 4.0 或 Framework
4.5),⼀般使⽤MySql.Data.Entity.EF6.dll
使⽤配置⽂件
<configuration>
<configSections>
<ction name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, P </configSections>
<startup>
<supportedRuntime version="v4.0" sku="Framework,Version=v4.5"/>
</startup>
<connectionStrings>
<clear/>
<!--清除默认的连接字符串,务必加上-->
<add name="Master" connectionString="databa=ef_otestdb;rver=192.168.107.13;uid=root;pwd=xxx;port=3306;Character Set=utf8;" providerName="MySq <add name="NoEF" connectionString="databa=ef_otestdb;rver=192.168.107.12;uid=root;pwd=xxx;port=3306;Character Set=utf8;" providerName="MySql. </connectionStrings>
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=n </providers>
</entityFramework>
</configuration>
可以看出:
<configSections>配置节是默认⽣成的没有变化。
<connectionStrings>配置节配了两个连接字符串,并且使⽤<clear/>清除默认配置。
<entityFramework>配置节变化较⼤,数据库客户端为MySql.Data.MySqlClient。codeConfigurationType为
MySql.Data.Entity.MySqlEFConfiguration
使⽤编码配置
public class CustomDbConfiguration : MySqlEFConfiguration
{
public CustomDbConfiguration():ba()
{
AddInterceptor(new CommandInterceptor(new Logger()));
SetDatabaLogFormatter((context, writeAction) => new CustomDatabaLogFormatter(context, writeAction));
SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => new MySqlExecutionStrategy());
}
}
[DbConfigurationType(typeof(CustomDbConfiguration))]
public class CustomDbContext : DbContext
{
public CustomDbContext()
: ba("name=Master")
{
//其他代码
}
}
配置⽂件和编码结合
配置⽂件部分
<configuration>
<configSections>
<ction name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, P </configSections>
<startup>
<supportedRuntime version="v4.0" sku="Framework,Version=v4.5"/>
</startup>
<connectionStrings>
<clear/>
<!--清除默认的连接字符串,务必加上-->
<add name="Master" connectionString="databa=ef_otestdb;rver=192.168.107.13;uid=root;pwd
=cnki2017;port=3306;Character Set=utf8;" providerName=" <add name="NoEF" connectionString="databa=ef_otestdb;rver=192.168.107.13;uid=root;pwd=cnki2学能训练
017;port=3306;Character Set=utf8;" providerName="M </connectionStrings>
<entityFramework>
<providers>
<provider invariantName="MySql.Data.MyS居里夫人的名言
qlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=n </providers>
</entityFramework>
</configuration>
编码部分
public class CustomDbConfiguration : MySqlEFConfiguration
{
public CustomDbConfiguration():ba()
{
//AddInterceptor(new CommandInterceptor(new Logger()));
SetDatabaLogFormatter((context, writeAction) => new CustomDatabaLogFormatter(context, writeAction)); //SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => new MySqlExecutionStrategy());
}
}
[DbConfigurationType(typeof(CustomDbConfiguration))]
public class CustomDbContext : DbContext
{
public CustomDbContext()
: ba("name=Master")
{
//this.Configuration.LazyLoadingEnabled = fal;
//new DropCreateDatabaIfModelChanges<CustomDbContext>()
//new DropCreateDatabaAlways<CustomDbContext>()
Databa.SetInitializer<CustomDbContext>(null);
this.Databa.Log = Log;
}
}