使用EFCore的Code First和MySql数据库迁移
1. 感慨一下
随着.net core的持续更新和升级,至少对于从事.net开发的人员和即将踏入这个领域的人来说,我相信大家的热情还是持续高涨的。国内的.net开发生态相比于之前来说,还是大有所好转的。在GitHub或者Gitee上使用.net core开发的开源项目也如雨后春笋一般,在不断增加,这当然少不了开源作者的付出和众多参与到开源项目的开发者的努力。
就拿ORM框架来说,国内也已经有了一些比较成熟的开源ORM项目,如sqlSugar,FreeSql等,这些框架对于一些主流数据库的支持也很完善了,特别对于国产的达梦和人大金仓数据库也有了很好的支持,这是一个很好的趋势,也都是值得被肯定和可持续发展的开源项目,如果对这两个项目还没有了解的同学,可以去GitHub上搜索了解和实践一下,说不定有一天就会用到你的项目当中来。
说到这里,也说一下微软一直以来也是有自己的ORM框架的。从.net framework时代的EntityFramework到现在的EntityFrameworkCore,微软也在持续更新,相信大家或多或少应该也有用过这个框架,有的人说这个框架很重,但我这里觉得未知全貌,不予评价。我自己也没有对这个框架了解和使用的特别深入,但是最近发现在使用EFCore的CodeFirst开发时,对于数据库的迁移,我认为它的支持还是做得很好的。为什么这么说呢,也是日常工作的一些有感而发。
现在项目的迭代开发过程中,一般都会分为开发,测试,生产环境。那么其中对于不同环境数据库的迁移(主要是表结构,数据),是迭代过程中不可缺少的一步。就我目前工作中的做法就是通过利用Navicat的数据库比对功能对不同环境下数据库比对生成差异化的sql脚本,最后放到测试环境,生产环境去执行。这样做,肯定是没有问题的,只要细心细致一点。然而EFCore给我们提供了一个更为快速和简单的方法。
2. 正文开始
2.1 创建一个项目
这里我以一个简单的控制台项目为例,我用到的开发工具是VS2022+.NET6,数据库用的是mysql,所以需要安装MySql的EFCore包,其它数据库版本可以参考下方的提供程序参考,引用自微软官方文档。使用VS2022创建一个项目,我给这个项目分了两层,一层作为我们的数据库实体层,另一层是应用层,我习惯用vs自带程序包管理控制台来安装,当然你也可以用Nuget包管理工具或者.NET CLI,由于主要是想演示EFCore的数据库迁移,所以还需要安装EFCore的命令行工具,安装代码都在下面了,安装完成后整个项目就是下面这个样子啦
Install-Package MySql.EntityFrameworkCore //MySql的EFCore 弃用,对最新版的EFCore没有支持
Install-Package Install-Package Pomelo.EntityFrameworkCore.MySql //对EFCore最新版支持 安装在实体层
Install-Package Microsoft.EntityFrameworkCore.Tools //EFCore命令行工具 安装在项目启动层
数据库提供程序参考:
| 数据库系统 | 配置示例 | NuGet 程序包 |
|---|---|---|
| SQL Server 或 Azure SQL | .UseSqlServer(connectionString) |
Microsoft.EntityFrameworkCore.SqlServer |
| Azure Cosmos DB | .UseCosmos(connectionString, databaseName) |
Microsoft.EntityFrameworkCore.Cosmos |
| SQLite | .UseSqlite(connectionString) |
Microsoft.EntityFrameworkCore.Sqlite |
| EF Core 内存中数据库 | .UseInMemoryDatabase(databaseName) |
Microsoft.EntityFrameworkCore.InMemory |
| PostgreSQL* | .UseNpgsql(connectionString) |
Npgsql.EntityFrameworkCore.PostgreSQL |
| MySQL/MariaDB* | .UseMySql(connectionString) |
Pomelo.EntityFrameworkCore.MySql |
| Oracle* | .UseOracle(connectionString) |
Oracle.EntityFrameworkCore |
(来源微软官方文档)
2.2 创建一个学生实体
CodeFirst这个词大家应该也不陌生了,主要就通过实体类来生成数据库的表,我这里也用CodeFirst为例。新建一个学生实体类,我这里用数据注释的方式来生成模型,当然大家也可用FluentAPI的方式具体可以看微软的官方文档。
[Table("student")]
[Comment("学生信息")]
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("id")]
public long Id { get; set; }
[Required]
[StringLength(30)]
[Column("name")]
[Comment("姓名")]
public string Name { get; set; }
[Column("age")]
[Comment("年龄")]
public int? Age { get; set; }
[Column("sex")]
[Comment("性别 0=未知,1=男,2=女")]
public GenderEnum Gender { get; set; }
[Column("email")]
[StringLength(50)]
[Comment("邮箱")]
public string Email { get; set; }
}
public enum GenderEnum
{
UnKnown=0,
Man=1,
Woman=2
}
2.3 创建自己的DbContext和DbContextFactory
EFCore中对于数据库的操作都来自于DbContext(数据库上下文),我们需要建一个自己项目的DbContext,可以参考下方代码,由于我这里没有直接在项目启动中创建DbContext实例,而是直接通过EFCore的命令行工具来创建,所以配置会有所不同,如果大家想看关于EFCore中DbContext的有关内容,可以直接点击DbContext配置和初始化查看。
public class DataContext:DbContext
{
public DataContext(DbContextOptions options)
: base(options)
{ } public DbSet<Student> Students { get; set; }
}
public class DataContextFactory : IDesignTimeDbContextFactory<DataContext>
{
public DataContext CreateDbContext(string[] args)
{
var opitonsBulider = new DbContextOptionsBuilder<DataContext>();
//替换成自己数据库连接字符串
string connStr = "DataSource=localhost;Initial Catalog=efcore;UserId=root;Password=xxx;Port=3306;CharacterSet=UTF8";
opitonsBulider.UseMySql(connStr, ServerVersion.AutoDetect(connStr));
return new DataContext(opitonsBulider.Options);
}
}
2.4 开始通过代码生成数据库
准备工作做好后,我们就可以通过命令行来生成数据库啦,我们在vs的程序包管理控制台运行下面的几个命令,运行成功后,就会是下面这样,生成成功之后,我们去看我我们的mysql数据库,就会成功生成好数据库和表了。
Add-Migration InitialCreate /*-OutputDir Your\Directory*/ //创建一个迁移,生成需要创建的表相关脚本,可以选择输出目录,默认在实体层会创建一个Migrations文件夹
Update-Database //执行脚本,正式更新到数据库


2.5 如何在生产环境部署呢
我们上面通过CodeFirst在本地开发环境生成了对应的数据库和表,这个操作我们肯定不能直接连接到生成环境,那么EFCore也提供了几种方法,因为我们项目的需求肯定是不断新增和变化的,就会涉及到表结构的调整。对于我们自己平常玩,可以直接删除库,再重新生成,对于生成环境肯定是不行的。我们可以通过EFCore工具来生成对应的sql脚本,然后到生产环境运行,有下面几种命令,执行完成后的sql脚本默认会在bin目录下面,更多有关知识请查看EFCore应用迁移,在去生产环境运行前,我们也要检查一下生成的sql脚本,避免造成意外的错误
Script-Migration //根据当前的迁移生成一个最新的数据库脚本
Script-Migration AddNewTables //生成从指定的迁移版本到最新的迁移的差异化脚本
Script-Migration AddNewTables AddAuditTable //生成从一个指定版本到另一个指定版本的迁移脚本
Script-Migration -Idempotent //此类脚本将在内部检查已经应用哪些迁移(通过迁移历史记录表),并且只应用缺少的迁移,幂等SQL脚本
3. 再感慨一下
到此就结束了,之前也很多次想写博客,但都只写了个开头,就存为草稿放那里了,甚至有的在草稿箱待几年了,开头很容易,坚持把它写完还真的挺需要决心的,不管自己写的怎么样,都算是一个记录吧,有句老话说的,”好记性不如烂笔头“,是没错的,希望自己在后面也能够不断沉淀,不断记录,不断分享,一定会有收获的。

使用EFCore的Code First和MySql数据库迁移的更多相关文章
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
- Code First操作Mysql数据库
前面博客也讲了,自己做一个网站,选用的是MVC+EF Code First+MySql+EasyUI,先说下技术选型.一.为什么选择MVC? 因为之前自己做的系统大部分是webForm,MVC的之前也 ...
- MySQL数据库迁移(转)
MySQL数据库迁移(数据文件直接迁移) 在今年10月下旬的时候,公司的服务器需要迁移,其中涉及到了MySQL数据库迁移.查看了一下MySQL数据文件的大小,接近60G的大小(实际数据并没用那么多). ...
- mysql数据库迁移到oracle数据库后 如何删除相同的数据
mysql数据库迁移到oracle数据库后 如何删除相同的数据 首先搞清楚有多少数据是重复的 select pid from product group by pid having count(pid ...
- django2.0+连接mysql数据库迁移时候报错
django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...
- MySQL数据库迁移与MySQL数据库批量恢复
目录 一.MySQL数据库迁移或备份 1. 了解使用InnoDB引擎创建数据库所产生的文件 2. 迁移数据库步骤 1. 从A服务器迁移至B服务器 2. MySQL重装并导入之前数据库 二.MySQL数 ...
- VS Code First使用Mysql数据库详解
最近电脑出毛病了,自己装显卡驱动给装死了开不了机,自己研究了两天也没解决,只有去修电脑的找专业人员,说起来惭愧,虽然自己是搞计算机的可电脑自己重装系统都还搞不定.重装系统又清理灰尘花了50大洋,现在用 ...
- EntityFramework 6.0< Code First > 连接 Mysql数据库(转)
http://blog.csdn.net/kmguo/article/details/19650299 网上有很多关于用EntityFrame来连接Mysql数据库的教程,可是很多并不靠谱,转载的太多 ...
- EntityFramework 6.0< Code First > 连接 Mysql数据库
网上有很多关于用EntityFrame来连接Mysql数据库的教程,可是很多并不靠谱,转载的太多了.找了很久,总算是配置好了,现在分享一下. 一,安装: 1.开发环境: VS2013与EF6 ...
- 转载:EntityFramework 6.0< Code First > 连接 Mysql数据库
转载自:http://blog.csdn.net/kmguo/article/details/19650299 网上有很多关于用EntityFrame来连接Mysql数据库的教程,可是很多并不靠谱,转 ...
随机推荐
- A - Add Odd or Subtract Even
A - Add Odd or Subtract Even 思路:其实认真观察就能发现,这个与输入的书有关系,且答案为0,1,2.先看相同,不用加减,为0,再看前小后大,因为加奇数减偶数,如果,相差奇数 ...
- 基于Face-Recognition的计算机人脸识别安全认证程序
20202411 2020-2021-2 <Python程序设计>实验四报告 基于Face-Recognition的计算机人脸识别安全认证程序 课程:<Python程序设计> ...
- Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]
P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...
- jquery.easyui.min.js:12401 Uncaught TypeError: Cannot read property 'combo' of undefined jquery.easyui.min.js:12401
踩坑中成长! jquery1.4.1升级到1.4.3 点击添加报错. 一步步调试js,发现是combox使用问题. 前端报错,未声明,js是easyui的所以只有jsp和js用法问题.看了官方用法,瞬 ...
- Loadrunner录制时弹出Microsoft Visual C++ Runtime Library解决方案
这段时间用loadrunner测试工具,录制脚本的时候老是出现这个弹窗,刚开始就以为是软件错误,就用的软件修复,也解决了,后来还是出现这样的错误,修复也没有用 原因:可能是代理服务器在调用VC库的时候 ...
- daimayuan第二课(1.二叉树的遍历,2.二叉树的最近公共祖先,3.二叉搜索树)
二叉树的最近公共祖先: 1:概念:就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵树上距离最近的公共祖先节点. 2:因为是基础课,所以tarjan和倍增lca就留到中级课再 ...
- 2.5基本算法之搜索 156:LETTERS
#include<iostream>#include<cstdio>using namespace std;char a[21][21];bool b[26]; int X[4 ...
- 常用功能系列---【JWT生成Token实现接口登录认证方案思路】
JWT生成Token实现接口登录认证方案思路 方案一(双token实现无感刷新) 在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面. 但是 ...
- 【SQL】数据库日志文件过大 4条命令删除日志
USE DATATABLE GO ALTER DATABASE DATATABLE SET RECOVERY SIMPLE DBCC SHRINKFILE (DATATABLE_Log, 1) ALT ...
- 盒子模型和CSS背景和列表
盒子模型(1)宽度-width:长度值 | 百分比 | auto-max-width:长度值 | 百分比 | auto-min-width:长度值 | 百分比 | auto(2)高度-height:长 ...
