ef core mysql 生成迁移失败_EF Core数据迁移操作步骤

本文介绍了在使用EF Core CodeFirst开发时,如何处理数据库表变更的问题。通过数据迁移功能,可以在线上项目中安全地更新数据库结构,而不会丢失已有数据。详细步骤包括安装EF相关包、创建数据库上下文、生成迁移以及执行数据库更新命令。此外,还展示了如何在已有实体类基础上添加字段并进行迁移,确保数据完整无损。
摘要由CSDN通过智能技术生成

摘要

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

数据迁移步骤

开发环境 vs2017+Mysql

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

1、新建一个web应用。

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

2、安装EF

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

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

AAffA0nNPuCLAAAAAElFTkSuQmCC

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 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

如图

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

生成数据库

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

插入数据后进行迁移测试

public IActionResult Index()

{

using (MyContext db = new MyContext())

{

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

db.SaveChanges();

}

return View();

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

二期,为了方便统计,需要用户的年龄,那么我们就可以为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>

查看数据表的变化

AAffA0nNPuCLAAAAAElFTkSuQmCC

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值