都已经用上了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工作。
然后你需要准备安装驱动和编写一些代码。
编辑你的项目文件,然后保存。(或者使用nugut搜索包安装)
all
runtime; build; native; contentfiles; analyzers; buildtransitive
当你保存的时候,rider或者visual studio 就会开始进行包的安装。
打开powershell或者cmd
dotnet tool install --global dotnet-ef
安装成功之后,注意使用
dotnet ef --version
将会输出ef工具的版本。
注意Pomelo.EntityFrameworkCore.MySql 需要和ef工具包的版本保持一致?(你可以查看如何安装特定版本的ef工具,使得两者保持一致。一般大版本一致即可)
需要在mysql中创建数据库。具体是不是必要的我也记不太清,可以先尝试不创建,如果不行再创建。
使用create database ministore。
"ConnectionStrings": {
"DefaultConnection": "server=localhost;port=3306;database=ministore;user=root;password=suzumiya;"
}
在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; }
}
右键项目,选择 Scaffold DbContext
选择provider和connection
然后注意DbContext 选项卡
这其实和之前使用Microsoft SQL时手动创建的上下文是一样的。
点击确定之后就会为我们创建这个数据库上下文。
我们向其中添加我们需要使用的数据库表的实体模型。
public DbSet? Students { get; set; } public DbSet ? Schools { get; set; }
最终MyDbContext的代码如此
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);
}
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工具的方式相同了。
创建迁移
(在项目,而非解决方案下的 控制台输入执行)
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 指定的是上面的类放置的文件。