Entity Framework学习笔记——配置EF

初次使用Entity Framework(如下简称EF),为了不很快忘记,决定开日志记录学习过程和遇到的问题。
由于项目比较小,只会用到EF的一些基本功能,所以先在此处制定一个学习目标:
1. 配置EF(指定EF用哪一个数据库,相信在大部分开发过程当中都不会使用官方Demo中的LocalDb)
2. 根据代码生成表(主要是一些特殊状况,好比但愿本身设置string类型属性的长度,不想统一都是nvarchar(max))
3. 生成视图(部分类其实但愿生成成为视图,这样可让数据库表设计更加符合范式,同时简化查询,不知道能不能实现)
4. 生成数据库脚本和变动脚本(对于Code First的方式来讲,这一步也是至关重要的,不然就没有Code First的意义了)

怎样获取EF,怎样添加EF到项目里去这里就不说了,使用NuGet是一个相对简单的方式,不清楚能够看官方的说明。添加完EF以后就须要对EF进行配置了,一般这时候配置文件里已经自动添加上默认的EF配置节点了,若是新建的是命令行程序,那配置文件应该就是这样:数据库

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <configSections>
 4     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
 5     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
 6   </configSections>
 7   <entityFramework>
 8     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
 9       <parameters>
10         <parameter value="v11.0" />
11       </parameters>
12     </defaultConnectionFactory>
13     <providers>
14       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
15     </providers>
16   </entityFramework>
17 </configuration>
View Code

能够看出配置文件的configSection中首先添加了一个名为entityFramework的section,下面接着多了一大篇 entityFramework的配置。defaultConnectionFactory项只会在没有添加connectionString配置项的情 况下使用,默认值是LocalDbConnectionFactory,也就是使用LocalDb。咱们能够将type改 为"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework",这样就可使用SQL Server数据库。parameter是SqlConnectionFactory的构造函数的参数,咱们能够将它的值改成咱们要指定的链接字符串,这 里可使用标准的SQL Server链接字符串。须要注意的一点是,在这里Initial Catalog或Database项会被忽略。这里遇到了点小问题,不能指定数据库名,难道只能使用默认生成的EFTest.DataContext做为 数据库名么?经过对象浏览器找到System.Data.Entity.Infrastructure.SqlConnectionFactory类型, 查看带参数的构造函数说明以下:浏览器

public SqlConnectionFactory(string baseConnectionString)
    System.Data.Entity.Infrastructure.SqlConnectionFactory 的成员

摘要:
使用给定的 BaseConnectionString 属性建立新的链接工厂。

参数:
baseConnectionString: 要用于“初始目录”以外的数据库的选项的链接字符串。
在调用 CreateConnection 时,将基于数据库名称在此字符串前预置“初始目录”。



public System.Data.Common.DbConnection CreateConnection(string nameOrConnectionString)
System.Data.Entity.Infrastructure.SqlConnectionFactory 的成员

摘要:
基于给定的数据库名称或链接字符串为 SQL Server 建立链接。若是给定的字符串包含“=”字符,

则将其视为一个完整的链接字符串,不然仅将其视为数据库名称。

参数:
nameOrConnectionString: 数据库名称或链接字符串。

返回值:
已初始化的 DbConnection。

能够得知数据库名称是经过调用CreateConnection方法时得到的。若是这时完成了官网上的最简单的Code First的Demo,代码里必定有一个父类为DbContext的BlogContext或者xxContext的类型。查看DbContext定义, 有一个构造函数参数名称为string nameOrConnectionString,得解。只须要将代码改成下面这样就能够了:ide

1     public class BlogContext : DbContext
2     {
3         public BlogContext()
4             : base("你的数据库名称")
5         {
6         }
7         public DbSet<Blog> Blogs { get; set; }
8         public DbSet<Post> Posts { get; set; }
9     }

固然,也能够直接设置connectionStrings,就能够直接将defaultConnectionFactory配置项删除了,也不须要代码里指定数据库名称。
配置文件最终相似这个样子:函数

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3     <configSections>
 4         <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
 5         <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
 6     </configSections>
 7     <entityFramework>
 8         <providers>
 9             <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
10         </providers>
11     </entityFramework>
12     <connectionStrings>
13         <add name="BlogContext"
14               providerName="System.Data.SqlClient"
15               connectionString="Server=xxx;Database=xxx;Integrated Security=False;User ID=sa;Password=xxx;"/>
16     </connectionStrings>
17 </configuration>
View Code

最后补充说明一点,配置的数据库链接字符串配置项的name应该与你的Context类型的名称一致,例如本例中就应该配置为BlogContext,以免其它额外的配置,至于能不能让二者不一样,笔者暂时没有研究,有兴趣的朋友能够研究研究。学习

相关文章
相关标签/搜索