摘要

在开发中,使用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方式中的基本操作。

EF Core数据迁移操作的更多相关文章

  1. [EF Core]数据迁移(二)

    摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...

  2. ef core数据迁移的一点小感悟

    ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...

  3. .net core2.1 - ef core数据库迁移,初始化种子数据

    起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别.一切OK,见下面内容. 1.首 ...

  4. EF Core 数据变更自动审计设计

    EF Core 数据变更自动审计设计 Intro 有的时候我们需要知道每个数据表的变更记录以便做一些数据审计,数据恢复以及数据同步等之类的事情, EF 自带了对象追踪,使得我们可以很方便的做一些审计工 ...

  5. EF Core新增迁移时无法加载程序集“System.ValueTuple”的错误

    EF Core使用迁移命令时,如: Add-Migration Init 有时会出现如下错误: System.IO.FileLoadException: Could not load file or ...

  6. ASP.NET Core ef启用数据迁移

    创建一个项目 通过Nuget获取EF Core相关的扩展包 appsettings.json 建立数据库连接串 创建数据库上下文EntityDbContext类,用于实体类映射数据库表 使用包管理器控 ...

  7. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  8. EF Code-First数据迁移

    Code-First数据迁移  首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...

  9. 【EF】EF Code-First数据迁移

    Code-First数据迁移  首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...

随机推荐

  1. 数据库优化之mysql【转】

    1. 优化流程图 mysql优化(主要增加数据库的select查询,让查询速度更快) 2. 优化mysql的方面 主要从以下四个方面去优化mysql ①存储层:如何选择一个数据库引擎,选择合适的字段列 ...

  2. mycat学习笔记

    MyCAT简易入门_数据库技术_Linux公社-Linux系统门户网站http://www.linuxidc.com/Linux/2016-01/127382.htm mycat读写分离配置 - PE ...

  3. linux服务器安装anaconda,然后远程使用jupyter

    linux服务器安装anaconda: 1.1 下载安装脚本: wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64. ...

  4. list的几种new方式比较ImmutableList

    数组的非空判断: -----数组的非空判断----- StringUtils.isNotBlank(array); list的非空判断: -----list的非空判断----- CollectionU ...

  5. Ubuntu下pycharm安装

    参考:http://blog.csdn.net/langb2014/article/details/51166782 http://www.cnblogs.com/zhcncn/p/4027025.h ...

  6. MySQL的聚集索引和非聚集索引

    一. MYSQL的索引 mysql中,不同的存储引擎对索引的实现方式不同,大致说下MyISAM和InnoDB两种存储引擎. MyISAM的B+Tree的叶子节点上的data,并不是数据本身,而是数据存 ...

  7. JS跨域设置和取Cookie

    在Javascript脚本里,一个cookie 实际就是一个字符串属性.当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值.每个cookie除了 name ...

  8. 【LOJ】#2182. 「SDOI2015」寻宝游戏

    题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻 ...

  9. Codeforces 932E Team Work 数学

    Team Work 发现网上没有我这种写法.. i ^ k我们可以理解为对于每个子集我们k个for套在一起数有多少个. 那么我们问题就变成了 任意可重复位置的k个物品属于多少个子集. 然后我们枚举k个 ...

  10. Codeforces Round #355 (Div. 2) D. Vanya and Treasure

    题目大意: 给你一个n × m 的图,有p种宝箱, 每个点上有一个种类为a[ i ][ j ]的宝箱,a[ i ][ j ] 的宝箱里有 a[ i ][ j ] + 1的钥匙,第一种宝箱是没有锁的, ...