EF Core 2.1 与EF Core3.1 CodeFirst与DBFirst的差别 ,DataBase映射模式(MySql)
一.Entity Framework Core 简介
1.概述
Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:使 .NET 开发人员能够使用 .NET 对象处理数据库,无需再像通常那样编写大部分数据访问代码。EF Core 支持多个数据库引擎。
2.MySql注意点
1.EF Core 2.1 依赖包
1. Microsoft.EntityFrameworkCore.Design (未变)
2. Microsoft.EntityFrameworkCore.Tools 与1版本一致((未变))
3. MySql.Data.EntityFrameworkCore
4. MySql.Data.EntityFrameworkCore.Design
2.EF Core 3.1 (踩坑) MySql.Data.EntityFrameworkCore.Design就不支持了
1. MySql.Data.EntityFrameworkCore
2. Pomelo.EntityFrameworkCore.MySql
注意:如果不使用Pomelo.EntityFrameworkCore.MySql 迁移数据时会报错
Method 'get_Info' in type 'MySql.Data.EntityFrameworkCore.Infraestructure.MySQLOptionsExtension' from assembly 'MySql.Data.EntityFrameworkCore, Version=8.0.18.0, Culture=neutral
, PublicKeyToken=c5687fc88969c44d' does not have an implementation.
二.使用CodeFirst连接MySql数据库
1.我们先通过Nuget管理器安装我们需要“Microsoft.EntityFrameworkCore.MySql”依赖包
2.新建连接工厂FreeLifeContext上下文,继承Microsoft.EntityFrameworkCore的DbContext类
3.在appsettings.json文件中配置mysql数据连接字符串“ConnectionStrings”
"ConnectionStrings": { "FreeLifeCon": "server=localhost;port=3380;user=root;password=nxYHY3JCaPih7usb;database=freelife;CharSet=utf8mb4" }
三、迁移数据库
1.执行Add-Migration freelife 命令用于创建迁移数据,文件名自定义,文件名称不能重复,每次更新数据库都需要重新定义迁移文件名称。
2.数据库迁移成功会在项目里生成一个“”Migration文件夹”,每次迁移都会产生新文件
3. 执行Update-Database开始迁移数据
4.查看数据是否迁移成功,迁移成功,会自动产生一张迁移记录表,记录每次迁移名称以及框架版本号
5.添加一些数据进行验证
注意:一般情况不要把SaveChanges写在循环里,这样在数据量大的时候非常影响性能。
SaveChanges():内部通过事务来执行,如果一条SQL语句执行失败,执行回滚操作;
内部执行步骤:
- 检查所有正在追踪的对象
- 读取每个对象的状态
- 生成SQL语句
- 执行所有生成的SQL语句
- 如果有返回数据的话,就获取这些返回数据。
四、DBFirst模式连接
1. 通过以下命令在freelife文件夹里生成FreeLifeContext上下文类和全部的实体类
dotnet ef dbcontext scaffold "server=127.0.0.1;port=3306;user=root;password=leesing@0124;database=freelife;CharSet=utf8mb4" MySql.Data.EntityFrameworkCore -o freelife -f
2.为了每次方便更新我使用批处理文件来进行保存CLI命令
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 dotnet ef dbcontext scaffold "server=127.0.0.1;port=3306;user=root;password=leesing@0124;database=freelife;CharSet=utf8mb4" MySql.Data.EntityFrameworkCore -o freelife -f 2 3 @echo off 4 setlocal ENABLEEXTENSIONS 5 setlocal EnableDelayedExpansion 6 set strOld=public byte 7 set strNew=public bool 8 for /r "freelife" %%a in (*.cs) do ( 9 echo Processing %%a... 10 for /f "tokens=1,* delims=" %%i in (%%a) do ( 11 set text=%%i 12 set text=!text:%strOld%=%strNew%! 13 echo !text!>> %%a.new 14 ) 15 move %%a.new %%a 16 ) 17 18 19 set _count=0 20 set _state=0 21 for /f "tokens=1,* delims=" %%a in (freelife\freelifeContext.cs) do ( 22 if !_state!==0 echo %%a>>freelife\freelifeContext.new 23 if !_count!==2 set /a _state=1 24 if !_count!==3 echo %%a 25 if !_count!==4 set /a _state=0& echo %%a 26 if "%%a"==" if (optionsBuilder.IsConfigured)" ( 27 set /a _count+=1 28 ) 29 if !_count! gtr 0 set /a _count+=1 30 ) 31 32 33 34 move freelife\freelifeContext.new freelife\freelifeContext.cs 35 echo 【按任意键退出】 36 pause>nul 37 exit
五、连接处理
1.为了以后能有更多的数据支持,我特意把连接抽离单独的文件
2.我写了一个单列模式的连接工厂
-
作者:LeeMicroShake
- 博客地址:https://www.cnblogs.com/LeeMicroShake
- 在此声明:学识浅薄,在求学路上的一个菜鸟行者,如有错误,请足下赐教讨论,让在下改正,请勿谩骂。
- 声明:原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
-
Mysql参考 [https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core-example.html]