EF Code-First数据迁移 配置技巧及命令说明;Entity Framework Code First数据库连接;Code-First数据迁移
济宁果壳科技
2017-08-12 18:47:24
88
5913
1. 安装Entity Framework
使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句:
PM> Install-Package EntityFramework
2. Entity Framework数据库连接配置
安装了Entity Framework之后,会自动添加App.config 文件。该文件中配置了Entity Framework的DefaultConnectionFactory,修改数据库连接字符串之后的连接具体如下:
在进行上面的为Entity Framework设置DefaultConnectionFactory之后,使用Entity Framework连接数据库不需再在其他地方进行设置,Entity Framework也不需要指定数据库连接。
Entity Framework连接数据库除了以上的方式,也可以通过配置常用的connectionStrings,修改App.config如下:
providerName="System.Data.SqlClient" />
3. Entity Framework DbContext连接数据库
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; namespace Portal { public class PortalContext : DbContext { static PortalContext() { Database.SetInitializer(null); //Database.SetInitializer(new CreateDatabaseIfNotExists()); //Database.SetInitializer(new DropCreateDatabaseAlways()); //Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } public PortalContext() : base("name=PortalContext") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { } } }
在PortalContext.cs中,使用了类的静态构造函数及构造函数。其中,在静态构造函数中设置数据库的初始化方式,在构造函数中指定App.config的connectionString。
3.1 Entity Framework数据库初始化方式
Entity Framework通过Database.SetInitializer来指定需要的数据库初始化方式,Database.SetInitializer可指定的数据库共有3种:
1>. CreateDatabaseIfNotExists
CreateDatabaseIfNotExists是Database.SetInitializer指定数据库的默认方式,用于当数据库不存在时,自动创建数据库。由于该方式是默认方式,所以可以不需要任何代码进行指定,当然也可以使用代码来明确的指定。
Database.SetInitializer(new CreateDatabaseIfNotExists());
2>. DropCreateDatabaseWhenModelChanges
DropCreateDatabaseWhenModelChanges用于当数据模型发生改变时,先删除原数据库,后创建新的数据库。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
3>. DropCreateDatabaseAlways
DropCreateDatabaseAlways用于每次均先删除原数据库再创建新的数据库,不管数据模型是否发生改变。
Database.SetInitializer(new DropCreateDatabaseAlways());
但是,在很多时候,我们希望即使在Entity Framework Code First与数据库不匹配时,宁可Entity Framework Code First报出数据库连接错误,而不希望对数据库进行任何的删除创建操作。Entity Framework Code First提供关闭数据库初始化操作:
Database.SetInitializer(null);
3.2 Entity Framework Code First连接数据库的一些设置
在实际使用Entity Framework Code First来操作数据库时,通常会在继承DbContext的类中作一些Entity Framework Code First的数据库操作设置。
1>. 禁用延迟加载(Lazy Loading)
在存在引用关系的两个实体类中,一个类的实例可以通过关联关系获取与之对应的另外一个类的一个或多个实例。在这种获取的时候,Entity Framework Code First提供了默认的延迟加载功能。一个类的实例,在需要使用另外一个类对应的实例时,可以直接读取在类中定义的关联属性,Entity Framework将自动到数据库中去读取返回需要的记录。当然这是延迟加载的好处,同样延迟加载也存在一些不好的地方。在Entity Framework通过延迟加载去读取关联记录时,可能执行过多的SQL语句,与实际所预想的不一致,从而影响代码的执行效率。
设置默认禁用延迟加载,在需要Entity Framework读取关联数据记录时采用显示加载。
public PortalContext() : base("name=PortalContext") { // 禁用延迟加载 this.Configuration.LazyLoadingEnabled = false; }
2>. 禁用关系数据的级联删除
在存在关联关系的数据记录间,当主表记录被删除时,自动删除从表中关联的记录。这个是关系数据库中大都存在的功能,包括MS SQL Server同样也提供了该功能。然而在实际的项目中,往往不想使用这种级联删除功能,在需要删除关联的记录时,也一样编写代码来进行删除。
Entity Framework Code First设置默认禁用关联数据的级联删除功能:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用一对多级联删除 modelBuilder.Conventions.Remove(); // 禁用多对多级联删除 modelBuilder.Conventions.Remove(); }
3>. 禁用默认表名复数形式
Entity Framework Code First在根据类名来生成数据表时,生成的数据表表名会是类名的复数形式。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默认表名复数形式 modelBuilder.Conventions.Remove(); };
PortalContext.cs的完整代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace Portal { public class PortalContext : DbContext { static PortalContext() { Database.SetInitializer(null); } public PortalContext() : base("name=PortalContext") { // 禁用延迟加载 this.Configuration.LazyLoadingEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默认表名复数形式 modelBuilder.Conventions.Remove(); // 禁用一对多级联删除 modelBuilder.Conventions.Remove(); // 禁用多对多级联删除 modelBuilder.Conventions.Remove(); } } }4、Code-First数据迁移
启动数据迁移
打开程序包管理器控制台,输入Enable-Migrations指令,以MvcMigrationDemoContext为例,输入如下:
Enable-Migrations -ContextTypeName MvcMigrationDemo.Models.MvcMigrationDemoContext
VS 会创建一个Migrations目录,包含两个文档**********_InitialCreate和Configuration。
你会发现**********_InitialCreate刚好和[dbo].[__MigrationHistory].MigrationId一致,文档记录了创建本次数据模型的完整描述。
Configuration定义了数据库迁移该有的行为。
4.1、运行数据库迁移在PM中,输入Add-Migration指令,必须带上一个版本名称。
进行迁移动作 在PM中输入Update-Database指令
到此,数据迁移完成。
附1:可通过Update-Database指令自动生成数据库迁移的T-SQL脚本,本次操作如下:Update-Database -SourceMigration *********_InitialCreate -TargetMigration **********_AddAbout -Script
附2:还原数据库 本次操作如下:Update-Database -TargetMigration **********_InitialCreate