Entity Framework(数据的迁移)
Category类中添加一个Grade 属性
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary.Models { /// <summary> /// 产品分类表 /// </summary> public class Category { /// <summary> /// 分类ID /// </summary> public int CategoryId { get; set; } /// <summary> /// 分类名称 /// </summary> public string CategoryName { get; set; } public string Grade { get; set; } /// <summary> /// 产品 /// </summary> public List<Product> ProductList { get; set; } } }
Product
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary.Models { /// <summary> /// 产品类 /// </summary> public class Product { /// <summary> /// 产品Id /// </summary> public int Id { get; set; } /// <summary> /// 产品名称 /// </summary> public string ProductName { get; set; } /// <summary> /// 产品价格 /// </summary> public decimal Price { get; set; } /// <summary> /// 出版日期 /// </summary> public DateTime PublicDate { get; set; } } }
Context引用上下文:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using ClassLibrary.Models; using System.Threading.Tasks; namespace ClassLibrary.EFDbContext { public class Context : DbContext { /// <summary> /// 1、创建构造函数,构造函数继承DbContext类的构造函数,通过DbContext类的构造函数创建数据库连接 /// 2、DbContext类的构造函数里面的参数是数据库连接字符串,通过该连接字符串去创建数据库 /// </summary> public Context() : base("name=CodeFirstApp") { } //2、定义数据集合:用于创建表 public DbSet<Category> Categorys { get; set; } public DbSet<Product> Products { get; set; } } }
要在App.config和添加数据的中的App.config 添加
<connectionStrings> <add name="CodeFirstApp" connectionString="Data Source=.;Initial Catalog=CodeFirstApp;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
name="CodeFirstApp"中的CodeFirstApp是与Context中base("name=CodeFirstApp")的CodeFirstApp对应
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ClassLibrary.EFDbContext; using ClassLibrary.Models; namespace ConsoleApp2 { class Program { static void Main(string[] args) { using (var context = new Context()) { //创建数据库 如果数据库不存在,则调用EF内置的API创建数据库 if (context.Database.CreateIfNotExists()) { Console.WriteLine("数据库创建成功!"); } else { Console.WriteLine("数据库已存在"); } //添加数据 var cate = new List<Category> { new Category{ CategoryName="文学类", Grade="15", ProductList=new List<Product>{ new Product { ProductName="百年孤独", Price=37.53m, PublicDate=new DateTime(2011,6,1) }, new Product { ProductName="老人与海", Price=37.53m, PublicDate=new DateTime(2010,6,1) } } }, new Category{ CategoryName="计算机类", Grade="20", ProductList=new List<Product>{ new Product { ProductName="C#高级编程第九版", Price=48.23m, PublicDate=new DateTime(2016,2,8) }, new Product { ProductName="Oracle从入门到精通", Price=27.03m, PublicDate=new DateTime(2014,7,9) } } } }; //将创建的集合添加到上下文中 context.Categorys.AddRange(cate); //调用SaveChanges()方法,将数据插入到数据库 if (context.SaveChanges() > 0) { Console.WriteLine("添加成功"); } Console.ReadKey(); } } } }
启用数据迁移:
1、打开迁移
【程序包控制台】:在【工具】——>【GuGet包管理工具】——>【程序包管理控制台】
在程序包管理器控制台中输入:Enable-Migrations
按回车键后,会生成Migrations文件夹,以及Migrations文件夹下面的Configuration类和201711281316287_InitialCreate类:
Configuration:这个类允许你去配置如何迁移,对于本文将使用默认的配置(在本文中因为只有一个Context,Enable-Migrations将自动对context type作出适配);
201711281316287_InitialCreate:这个迁移之所以存在是因为我们之前用Code First创建了数据库,在启用迁移之前,scaffolded migration里面的代码表示在数据库中已经创建的对象,本文中即为表Students。
Code First Migrations有两个需要熟悉的命令:
Add-Migration 将scaffold创建下一次基于上一次迁移以来的更改的迁移;
Update-Database 将任何挂起的迁移应用到数据库;
以上面新增加的字段Grade属性为例,命令Add-Migration允许我们对迁移进行命名,我们把迁移命名为AddGrade。
2、增加迁移节点
在程序包管理器控制台中输入命令:Add-Migration AddGrade
一个新的迁移(201711281402492_AddGrade)在目录Migrations中创建成功:
201711281402492_AddGrade类结构如下:
namespace EF.FluentAPI.Migrations { using System; using System.Data.Entity.Migrations; public partial class AddGrade : DbMigration { public override void Up() { AddColumn("dbo.Students", "Grade", c => c.String(nullable: false, maxLength: 16, unicode: false)); } public override void Down() { DropColumn("dbo.Students", "Grade"); } } }
201711281402492_AddGrade的名称是上面Add后面定义的迁移名称,而类下面有两个方法:一个是Up,一个是Down,记录了需要升级的修改,这里也就是Students表增加了Grade列。只要我们在后面执行Update-Database,就会执行此类下面的Up函数。
这里的Down函数简单介绍就是:为了回滚修改而设计的。如果用户希望恢复到某一个迁移节点,程序会自动根据已经执行的迁移,判断回滚哪些迁移,执行他们的Down函数。
3、更新数据库
在程序包管理器控制台中输入命令:Update-Database -Verbose
查看数据库,Students表已经增加Grade字段:
到此为止,迁移已经完成。(对表的的修改都可以通过迁移来改变数据库哦)