为什么使用mysql
都已经用上了asp.net core 为什么不适用ms sql server. 我也是很苦恼,但是事实就是如此,微软的数据库引擎无法在某些情况下使用。
比如: windows11 附加 三星1T固态。
据查询的资料所知,可能是因为某些固态的最小分区和微软数据库引擎的要求不一样,所以无法使用。因为这个事情,我都已经重装了好几次电脑了。
我还以为是因为我把windows10 升级成windows11 导致的某些东西产生了不兼容,导致的无法使用呢。
总之,目前无法愉快地在windows11上使用微软数据库,所以就转向了使用MYSQL。
并没有很简单
在最开始接触ef工具和
Microsoft.EntityFrameworkCore
的时候,我就知道,这个东西支持各种数据库,我以为只要更改个连接字符串就可以工作了。
但是事实上并非如此,并且还有一些其他的问题。
网络上的文档太少了,即使是编写mysql驱动的
https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql
的文档也是很简单(对于我来说)。
使用它的文档,不是很容易完成这一工作。
那么该怎么做
首先做好准备工作
你需要准备好你的mysql数据库
创建一个 asp.net core 程序,创建一些模型用于验证ef工作。
然后你需要准备安装驱动和编写一些代码。
那么,从这里开始吧!
1. 安装包
编辑你的项目文件,然后保存。(或者使用nugut搜索包安装)
allruntime; build; native; contentfiles; analyzers; buildtransitive
当你保存的时候,rider或者visual studio 就会开始进行包的安装。
2. 安装ef工具
打开powershell或者cmd
dotnet tool install --global dotnet-ef
安装成功之后,注意使用
dotnet ef –version
将会输出ef工具的版本。
注意Pomelo.EntityFrameworkCore.MySql 需要和ef工具包的版本保持一致?(你可以查看如何安装特定版本的ef工具,使得两者保持一致。一般大版本一致即可)
3. 在appsetting.json 中填写数据库连接字符串
需要在mysql中创建数据库。具体是不是必要的我也记不太清,可以先尝试不创建,如果不行再创建。
使用create database ministore。
"ConnectionStrings": {"DefaultConnection": "server=localhost;port=3306;database=ministore;user=root;password=suzumiya;"}
4. 编写模型类
在Models文件夹中添加
public class Student{[DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int Id { get; set; }[Required]public string? Name { get; set; }[Required]public int Age{get;set;}[Required][ForeignKey("School")]public int SchoolId { get; set; }}
public class School{[DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int Id { get; set; }[Required]public string? Name { get; set; }public string? Description { get; set; }}
5. 开始使用脚手架
右键项目,选择 Scaffold DbContext
选择provider和connection
然后注意DbContext 选项卡
这其实和之前使用Microsoft SQL时手动创建的上下文是一样的。
点击确定之后就会为我们创建这个数据库上下文。
我们向其中添加我们需要使用的数据库表的实体模型。
public DbSet" />public partial class MyDbContext : DbContext{public MyDbContext(){}public MyDbContext(DbContextOptions options): base(options){}protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.=> optionsBuilder.UseMySql("server=localhost;port=3306;database=ministore;user=root;password=suzumiya", Microsoft.EntityFrameworkCore.ServerVersion.Parse("8.0.35-mysql"));protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.UseCollation("utf8mb4_0900_ai_ci").HasCharSet("utf8mb4");OnModelCreatingPartial(modelBuilder);}public DbSet? Students { get; set; }public DbSet? Schools { get; set; }partial void OnModelCreatingPartial(ModelBuilder modelBuilder);}
6. 在program中添加连接语句
using db.Context;using Microsoft.EntityFrameworkCore;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllersWithViews();var serverVersion = new MySqlServerVersion(new Version(8, 0, 34));// Replace 'YourDbContext' with the name of your own DbContext derived class.builder.Services.AddDbContext(dbContextOptions =>{dbContextOptions.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"), serverVersion)// The following three options help with debugging, but should// be changed or removed for production..LogTo(Console.WriteLine, LogLevel.Information).EnableSensitiveDataLogging().EnableDetailedErrors();});var app = builder.Build();// Configure the HTTP request pipeline.if (!app.Environment.IsDevelopment()){app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();
到了这里,接下来的步骤就和之前的使用ef工具的方式相同了。
7. 创建迁移和应用迁移
创建迁移
(在项目,而非解决方案下的 控制台输入执行)
dotnet ef migrations add Initial –context MyDbContext
一般如果只有一个DbContext 就不需要指定上下文了。当然加上也没有什么坏处
应用迁移
dotnet ef database update
更高级的,条件限制?
并不是总是能够使用rider,这时候该怎们办?
super方式,直接预览rider的参数
工作区是
C:\Users\betha\source\repos\db
指令(command)是
"C:\Program Files\dotnet\dotnet.exe" ef dbcontext scaffold --project db\db.csproj --startup-project db\db.csproj --configuration Debug server=localhost;port=3306;database=ministore;user=root;password=suzumiya; Pomelo.EntityFrameworkCore.MySql --context MyDbContext --context-dir Context --force --output-dir Migrations --use-database-names
“C:\Program Files\dotnet\dotnet.exe” ef dbcontext scaffold –project db\db.csproj –startup-project db\db.csproj –configuration Debug server=localhost;port=3306;database=ministore;user=root;password=suzumiya; Pomelo.EntityFrameworkCore.MySql –context MyDbContext –context-dir Context –force –output-dir Migrations –use-database-names
很明显,工作区是解决方案的目录
command的各个部分分别是
“C:\Program Files\dotnet\dotnet.exe” 是ef 的上方程序dotnet
–project db\db.csproj 指定的是项目
–startup-project db\db.csproj 指定的也是项目
server=localhost;port=3306;database=ministore;user=root;password=suzumiya; 指定的是数据库连接字符串
Pomelo.EntityFrameworkCore.MySql 指定的是驱动(连接包)
–context MyDbContext 是脚手架要生成的数据库上下文的类名
–context-dir Context 指定的是上面的类放置的文件。