摘要

在开发中,使用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. spring-boot-mybatis-多数据源

    sql 语句 DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT ...

  2. LOJ 2249: 洛谷 P2305: 「NOI2014」购票

    题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...

  3. 转:Citrix虚拟化--转自CSDN

    http://blog.csdn.net/kkfloat/article/category/1430751/3

  4. LINUX下 USB转串口 【转】

    转自:http://blog.163.com/smilexiao_11015461/blog/static/2122052182012102410399459/ 1.将设备u口插入pc2.输入#lsm ...

  5. Linux本地解析文件/etc/hosts说明【原创】

    windows的域名本地解析文件hosts是可以一个域名对多个IP,如果有一个IP有问题,可以去解析到其他IP Linux的本地解析文件/etc/hosts,是否也可以这样呢.下面做了个测试 先看一下 ...

  6. MAVEN:不能互相引用

    工程A,工程B,工程C,这三个工程:C依赖B,B依赖A,这是没有问题的. 但是不能A依赖B,B又依赖A,这是不允许的.

  7. jquery easyui:tab自动加载第一个tab内容

    $('#resourceTabs').tabs('unselect', 0);$('#resourceTabs').tabs('select', 0);

  8. 为你的 Hadoop 集群选择合适的硬件

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  9. CentOS7.x使用overlay文件系统

    https://www.cnblogs.com/yufeng218/p/8370670.html http://www.cnblogs.com/lehuoxiong/p/9908118.html ht ...

  10. 【PAT】1032 Sharing (25)(25 分)

    1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...