运行脚本迁移命令。
Entity Framework Core 3.0.0 使用提供程序“Pomelo.EntityFrameworkCore.MySql”初始化“ApplicationDbContext”,选项为:MaxPoolSize=128 ServerVersion 5.7.22 MySql
为 ASP.NET Core Identity 生成的 SQL 脚本包含错误。 当我尝试在我的数据库上执行(只是第一个 CREATE TABLE)脚本时,我收到错误消息。
似乎 nvarchar 和 nvarchar(max) 是问题所在。
创建表AspNetRoles
(
Id
nvarchar(450) 非空,
Name
nvarchar(256) NULL,
NormalizedName
nvarchar(256) NULL,
ConcurrencyStamp
nvarchar(max) NULL,
约束PK_AspNetRoles
主键 ( Id
)
);
分析过程中发现4处错误。
无法识别的数据类型。 (在位置 39 的“nvarchar”附近)
无法识别的数据类型。 (在位置 75 的“nvarchar”附近)
无法识别的数据类型。 (在位置 117 的“nvarchar”附近)
无法识别的数据类型。 (在位置 161 的“nvarchar”附近)
SQL查询:
创建表AspNetRoles
( Id
nvarchar(450) NOT NULL, Name
nvarchar(256) NULL, NormalizedName
nvarchar(256) NULL, ConcurrencyStamp
nvarchar(max) NULL, 约束PK_AspNetRoles
PRIMARY KEY ( Id
) )
MySQL 说: 文档
CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
)' 在第 5 行
MySQL 版本:5.7.22
操作系统:Windows 10
Pomelo.EntityFrameworkCore.MySql 版本:3.0.0-rc1.final
Microsoft.AspNetCore.App 版本:3.0
在尝试重现 #863 时,我在dotnet ef update database
命令上遇到相同的错误,该命令在后台使用相同的迁移类。 现在检查这个。
如果您创建新的 ASP.NET Core 项目(启用身份验证选项),将 EF Core 提供程序更改为Pomelo.EntityFrameworkCore.MySql
,然后运行迁移或更新命令,则可能会发生这种情况。
问题是 VS 假设您将使用 SQL Server,因此它试图帮助您并已将初始迁移CreateIdentitySchema
到文件.\Data\Migrations\00000000000000_CreateIdentitySchema.cs
(包含Up
和Down
操作)和.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(包含高度依赖数据库的目标模型),它们是使用 SQL Server 提供程序生成的。
如果您使用的是 SQL Server,这确实少了一步。 但是,如果您使用任何其他数据库提供程序,它将包含错误的迁移。
如果您只使用 MySQL 而不是 SQL Server,解决此问题的最简单方法是首先确保UseMySql()
在您的ConfigureServices
方法中被调用:
```c#
options.UseMySql(
Configuration.GetConnectionString("DefaultConnection"));
Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:
dotnet ef 迁移添加 CreateIdentitySchema
After that, the newly created initial migration will be compatible with MySQL and other operations based on that migration will be as well.
For example, the `CREATE TABLE` script for `AspNetRoles` when creating a migration script (by using `dotnet ef migrations script`) will look like this:
```sql
CREATE TABLE `AspNetRoles` (
`Id` varchar(255) NOT NULL,
`Name` varchar(256) NULL,
`NormalizedName` varchar(256) NULL,
`ConcurrencyStamp` longtext NULL,
CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
);
如果您创建新的 ASP.NET Core 项目(启用身份验证选项),将 EF Core 提供程序更改为
Pomelo.EntityFrameworkCore.MySql
,然后运行迁移或更新命令,则可能会发生这种情况。问题是 VS 假设您将使用 SQL Server,因此它试图帮助您并已将初始迁移
CreateIdentitySchema
到文件.\Data\Migrations\00000000000000_CreateIdentitySchema.cs
(包含Up
和Down
操作)和.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(包含高度依赖数据库的目标模型),它们是使用 SQL Server 提供程序生成的。
在 Pomelo.EntityFrameworkCore.MySql 版本 2.2 中,它无需删除和重新创建 CreateIdentitySchema 即可工作,
生成的创建表脚本
CREATE TABLE `aspnetroles` (
`Id` varchar(255) NOT NULL,
`Name` varchar(256) DEFAULT NULL,
`NormalizedName` varchar(256) DEFAULT NULL,
`ConcurrencyStamp` longtext,
PRIMARY KEY (`Id`),
UNIQUE KEY `RoleNameIndex` (`NormalizedName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
没有任何错误,
我希望 3.0 + 应该在兼容性和可用性方面工作相同。
这种变化有什么原因吗?
谢谢,
在 Pomelo.EntityFrameworkCore.MySql 版本 2.2 中,它无需删除和重新创建 CreateIdentitySchema 即可工作
如果它在 Pomelo 2.2 中为您工作而没有任何更改,那就太好了,但不能一概而论,因为它高度依赖于您的配置(和密钥类型)。
如上所述,您应该在创建新项目时重新生成初始迁移,以确保获得有效的迁移和模型定义。 如果你不这样做,你就靠自己了,可能需要稍微修改生成的代码才能让它工作(根据你的 MySQL 知识,这可以毫不费力地完成)。
3.0 版本发生了一些重大更改(应适当标记),因此对于任何主要或次要升级,请先在开发和暂存环境中测试您的代码,然后再将其移至生产环境。
没有任何错误,
[...]
这种变化有什么原因吗?
你具体说的是3.0的哪些错误和变化?
从 2.2.6 到 3.0.0 有很多变化,所以请随时向我们发布有问题的模型类、它的定义、生成的迁移和生成的 SQL 脚本,以便我们可以讨论您遇到的任何问题。
最有用的评论
如果您创建新的 ASP.NET Core 项目(启用身份验证选项),将 EF Core 提供程序更改为
Pomelo.EntityFrameworkCore.MySql
,然后运行迁移或更新命令,则可能会发生这种情况。问题是 VS 假设您将使用 SQL Server,因此它试图帮助您并已将初始迁移
CreateIdentitySchema
到文件.\Data\Migrations\00000000000000_CreateIdentitySchema.cs
(包含Up
和Down
操作)和.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(包含高度依赖数据库的目标模型),它们是使用 SQL Server 提供程序生成的。如果您使用的是 SQL Server,这确实少了一步。 但是,如果您使用任何其他数据库提供程序,它将包含错误的迁移。
如果您只使用 MySQL 而不是 SQL Server,解决此问题的最简单方法是首先确保
UseMySql()
在您的ConfigureServices
方法中被调用:```c#
options.UseMySql(
Configuration.GetConnectionString("DefaultConnection"));
dotnet ef 迁移添加 CreateIdentitySchema