Pomelo.entityframeworkcore.mysql: 默认 ASP.NET Core 3.0 项目和标识选项的 nvarchar 和 nvarchar(max) 错误

创建于 2019-10-09  ·  4评论  ·  资料来源: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

重现步骤

运行脚本迁移命令。

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 说: 文档

1064 - 你的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以获取在“max) NULL 附近使用的正确语法”,

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

closed-user-error

最有用的评论

如果您创建新的 ASP.NET Core 项目(启用身份验证选项),将 EF Core 提供程序更改为Pomelo.EntityFrameworkCore.MySql ,然后运行迁移或更新命令,则可能会发生这种情况。

问题是 VS 假设您将使用 SQL Server,因此它试图帮助您并已将初始迁移CreateIdentitySchema到文件.\Data\Migrations\00000000000000_CreateIdentitySchema.cs (包含UpDown操作)和.\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`)
);

所有4条评论

在尝试重现 #863 时,我在dotnet ef update database命令上遇到相同的错误,该命令在后台使用相同的迁移类。 现在检查这个。

如果您创建新的 ASP.NET Core 项目(启用身份验证选项),将 EF Core 提供程序更改为Pomelo.EntityFrameworkCore.MySql ,然后运行迁移或更新命令,则可能会发生这种情况。

问题是 VS 假设您将使用 SQL Server,因此它试图帮助您并已将初始迁移CreateIdentitySchema到文件.\Data\Migrations\00000000000000_CreateIdentitySchema.cs (包含UpDown操作)和.\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 (包含UpDown操作)和.\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 脚本,以便我们可以讨论您遇到的任何问题。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

coultonluke picture coultonluke  ·  3评论

matthewjcooper picture matthewjcooper  ·  4评论

mason-chase picture mason-chase  ·  4评论

Toemsel picture Toemsel  ·  3评论

IonRobu picture IonRobu  ·  3评论