常用的三行NuGet用于EF命令(当然可以直接用命令“get-help EntityFramework”获取):“Enable-Migrations” --在对应项目中启用、“Add-Migration <名称>” --搭建基架、“Update-Database” --提交(应用基于代码的迁移)
添加简单的实体
/// <summary> /// 人名 /// </summary> public class PersonName { public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } } }
添加上下文
public class CodeFirstDbContext : DbContext { public DbSet<UserModel> Users { get; set; } public CodeFirstDbContext() : base("DefautConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<UserModel>(); } }
在“程序包管理控制台”(注意第二步截图中所说的,以下关于NuGet命令均必须如此),输入“Enable-Migrations”回车
在DbContext所在的项目CodeFirst下的App.config下添加如下节点(注意不要添加到configSections节点之前)
设置好数据库连接字串
<connectionStrings> <add name="Default" connectionString="Server=.; Database=ModuleZeroSampleProject; user id=sa;password=sa" providerName="System.Data.SqlClient" /> </connectionStrings>
在“程序包管理控制台”输入命令“Enable-Migrations”,保证无错误提示,继续输入“Add-Migration CreateDb”,注意CreateDb可由咱们自行定义。
最后在控制台中输入命令同步到 “Update-Database” 同步生成数据库
关于数据迁移
Enable-Migrations
执行完命令后,在项目中自动生成文件夹Migrations,以及文件夹下面的Configuration.cs和201502150256371_InitialCreate.cs
增属性
修改类的结构,在这里,我们假设新增属性public string Test{get;set;},生成程序
增加迁移的节点:Add-Migration PaperTest(在前面操作的基础上,执行这条命令时,程序会自动判断在上次迁移基础上的修改)
执行完上面的命令后,会在文件夹Migrations下自动生成一个类:
public partial class PaperTest : DbMigration { public override void Up() { AddColumn("dbo.Papers", "Test", c => c.String()); } public override void Down() { DropColumn("dbo.Papers", "Test"); } }
class的名称是上面Add后面定义的。而类下面有两个方法,一个是Up,一个是Down。在Up里面,记录了需要升级的修改,这里也就是Papers表格增加了列Test。只要我们在后面执行Update-Database,就会执行此类下面的Up函数。
这里的Down函数简单介绍就是,为了回滚修改而设计的。如果用户希望恢复到某一个迁移节点,程序会自动根据已经执行的迁移,判断回滚哪些迁移,执行他们的Down函数。
执行Update-Database,将这里的修改升级到数据库
删属性
删除属性的操作和增加属性的操作差不多。首先修改类结构,屏蔽上面的//public string Test { get; set; }。然后Add一个迁移节点,命名为DelPaperTest。执行此命令,生成相应的迁移类文件。最后执行Update-Database
改属性
1.在Paper类下修改属性名称,生成项目:
public string Desc { get; set; } --> public string DescAA { get; set; }
.按照常规的方法,接下来我们应该添加一个迁移的节点。首先我们看看这样执行有什么样的结果:
Add-Migration ModifyPaper
public partial class ModifyPaper : DbMigration { public override void Up() { AddColumn("dbo.Papers", "DescAA", c => c.String()); DropColumn("dbo.Papers", "Desc"); } public override void Down() { AddColumn("dbo.Papers", "Desc", c => c.String()); DropColumn("dbo.Papers", "DescAA"); } }
可以看到在Up里面,它不是直接修改了列的名称,而是先增加新列DescAA,然后删除旧列Desc。这样执行有一个后果,如果列里面有数据,则数据全部丢失。