首页 > 数据库 >使用EFCore的Code First和MySql数据库迁移(转载 )

使用EFCore的Code First和MySql数据库迁移(转载 )

时间:2023-03-31 17:45:41浏览次数:52  
标签:Code 数据库 生成 EntityFrameworkCore EFCore MySql 迁移 public

下辈子还当程序员

 

随笔 - 4  文章 - 0  评论 - 9  阅读 - 44432

使用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.  再感慨一下

      到此就结束了,之前也很多次想写博客,但都只写了个开头,就存为草稿放那里了,甚至有的在草稿箱待几年了,开头很容易,坚持把它写完还真的挺需要决心的,不管自己写的怎么样,都算是一个记录吧,有句老话说的,”好记性不如烂笔头“,是没错的,希望自己在后面也能够不断沉淀,不断记录,不断分享,一定会有收获的。

 

标签:Code,数据库,生成,EntityFrameworkCore,EFCore,MySql,迁移,public
From: https://www.cnblogs.com/zengpeng/p/17277007.html

相关文章

  • mysql——null值和空值
    参考:https://blog.csdn.net/xp178171640/article/details/103065271?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-103065271-blog-107128984.235%5Ev27%5Epc_relevant_3mothn_strategy_and_data_recovery......
  • LeetCode 94 二叉树的中序遍历
    LeetCode|94.二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序 遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围[0,100]内-100<=Node.val<=100迭代实现:......
  • encodeURI()、encodeURIComponent()区别及使用场景
    一、URLURL是使用ASCII进行编码的,所以有些内容是不支持的,例如中文,URL会使用编码的手段将其转义为可解释内容。在URL中,合法字符分成两类。URL元字符:分号(;),逗号(,),斜杠(/),问号(?),冒号(:),at(@),&,等号(=),加号(+),美元符号($),井号(#) 语义字符:a-z,A-Z,0-9,连词号(-),下划线(_),点(.),感叹号(!),波浪......
  • mysql全文索引
    建立索引语句1.需要字段字符集一致utf8mb4根据自己字段定义ALTERTABLEuserADDFULLTEXT(name,email,phone,external_id)WITHPARSERngramCHARSETutf8mb4;索引占用空间user表大约80M,创建的全文索引占用空间约100M(不含表大小)使用全文索引两种查法:select*from......
  • vscode ssh连接到远程服务器进行开发
    1.环境配置1.1本地环境配置·安装vscode·安装Remote-SSH插件1.2远程环境配置(Linux)·安装vscode·安装并配置ssh(网上很多教程,自行查阅) 2.将本地vscode连接到远程服务器2.1打开远程窗口 2.2配置连接到远程  2.3连接到远程服务器之后便会出现配置连......
  • 反转链表-leetcode92
    给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例1:输入:head=[1,2,3,4,5],left=2,right=4输出:[1,4,3,2,5]示例2:输入:head=[5],left=1,right=1输出:[5]//leet......
  • Mysql之SQL语句基础1
    一、基本概念——后续的内容将会记录作者在计科学习内容DB(数据库):存储数据的仓库,数据是有组织进行存储DBMS(数据库管理系统):操纵和管理数据库的大型软件SQL:操纵关系数据库的编程语言,是一套标准有Mysql,Oracle,SQLSever,PostgreSQlRDBMS(关系型......
  • mysql Error:index column size too large. the maximum column size is 767 bytes
    问题现象mysql在执行脚本create创建表时,提示以下错误:indexcolumnsizetoolarge.themaximumcolumnsizeis767bytes异常原因INNODB引擎,UTF-8,主键字符串默认最大767,需要修改解决方案对数据库进行设置setglobalinnodb_large_prefix=ON参考博客......
  • php站点导入大mysql文件(linux系统)
    问题描述:站点数据多,mysql导出后大于1G,使用phpmyadmin,导入一半报错,白白浪费等待时间,使用navicat导入,执行时间过长提示错误解决思路:1.拆分mysql文件,分批次导入,亲测还是比较花费时间,小于100M可以尝试,大于100M不推荐2.推荐使用进入linux系统导入mysql,步骤如下:2.1:把导出的.sql大文......
  • mysql的查询--子查询,order by,group by,having
    一、1.多表查询 格式1: select字段列表 from表1join表2on表1.字段1=表2.字段1 where查询条件 格式2: select字段列表 from表1join表2on表1.字段1=表2.字段1 join表3on表2.字段2=表3.字段2 where查询条件 格式......