隐藏

EF Core数据迁移操作步骤

发布:2021/7/5 11:22:35作者:管理员 来源:本站 浏览次数:1034

摘要


在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数据库重新生成就不行了,那么该如何解决呢?Ef提供了一种数据迁移的操作。具体该如何操作呢。

数据迁移步骤


开发环境 vs2017+Mysql


这里以web为例。具体该如何操作。


1、新建一个web应用。


发现Asp.Net Core站点,项目结构又有变化,项目结构如下:


发现这里吧wwwroot又移到了站点下面,之前是分开的。这样更接近原先的asp.net mvc项目的结构。


2、安装EF


使用Nuget进行安装,下面的2个包


Microsoft.EntityFrameworkCore


Microsoft.EntityFrameworkCore.Tools


Pomelo.EntityFrameworkCore.MySql


Tools包,功能用于数据迁移,更新数据库等操作。


3、添加测试的类和数据库上下文


using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

using System.Linq;

using System.Threading.Tasks;


namespace Wolfy.MigrationDemo.Models

{public class User

   {

       [Key]

       public int Id { set; get; }

       public string Name { set; get; }

       public DateTime CreateTime { set; get; } = DateTime.Now;

       public DateTime ModifyTime { set; get; } = DateTime.Now;

   }

}


数据库上下文


注意:这里需要添加Pomelo.EntityFrameworkCore.MySql包


using Microsoft.EntityFrameworkCore;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Wolfy.MigrationDemo.Models;


namespace Wolfy.MigrationDemo.Data

{

   public class MyContext : DbContext

   {

       public DbSet<User> Users { set; get; }

       protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

         => optionsBuilder

             .UseMySql(@"Server=localhost;database=migrationtest;uid=root;pwd=abcd;");

   }

}


4、通过Migration生成数据库


在vs的Nuget控制台,输入以下命令


Add-Migration init


如图


初始化成功后,在解决方案下,会出现下面的目录


注意:在新建项目的时候,最好是放在英文目录下,在2.0版本的情况下,不然在执行该命令的时候,会出现因为中文乱码,导致json格式化报错。


生成数据库




命令执行成功,生成数据库


插入数据后进行迁移测试



       public IActionResult Index()

       {

           using (MyContext db = new MyContext())

           {

               db.MyUsers.Add(new Models.User { Name = "Wolfy" });

               db.SaveChanges();

           }

           return View();

       }



二期,为了方便统计,需要用户的年龄,那么我们就可以为User添加字段,通过数据迁移,添加字段,并不会影响原先的数据。


如图,变化的实体类如下



   public class User

   {

       [Key]

       public int Id { set; get; }

       public string Name { set; get; }

       public DateTime CreateTime { set; get; } = DateTime.Now;

       public DateTime ModifyTime { set; get; } = DateTime.Now;

       public int Age { set; get; }

   }


执行迁移命令



PM> Add-Migration init

To undo this action, use Remove-Migration.

PM> Update-Database init

Applying migration '20170917062429_init'.

Done.

PM> Add-Migration updatedb

To undo this action, use Remove-Migration.

PM> Update-Database updatedb

Applying migration '20170917063252_updatedb'.

Done.

PM>


查看数据表的变化


总结


这篇文章介绍了数据迁移在code first方式中的基本操作。