Pomelo.entityframeworkcore.mysql: Ошибки nvarchar и nvarchar (max) с проектом ASP.NET Core 3.0 по умолчанию и параметром Identity

Созданный на 9 окт. 2019  ·  4Комментарии  ·  Источник: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Действия по воспроизведению

Запустите команду Script-Migration.

Entity Framework Core 3.0.0 инициализировал ApplicationDbContext с помощью поставщика Pomelo.EntityFrameworkCore.MySql с параметрами: MaxPoolSize = 128 ServerVersion 5.7.22 MySql

Проблема

Сгенерированный сценарий SQL для удостоверения ASP.NET Core содержит ошибки. Я получаю сообщения об ошибках, когда пытаюсь выполнить (только первый CREATE TABLE) сценарий в моей базе данных.
Кажется, что проблемы с nvarchar и nvarchar (max).

СОЗДАТЬ ТАБЛИЦУ AspNetRoles (
Id nvarchar (450) НЕ NULL,
Name nvarchar (256) NULL,
NormalizedName nvarchar (256) NULL,
ConcurrencyStamp nvarchar (max) NULL,
ОГРАНИЧЕНИЕ PK_AspNetRoles ПЕРВИЧНЫЙ КЛЮЧ ( Id )
);

При анализе обнаружено 4 ошибки.

Неизвестный тип данных. (рядом с nvarchar на позиции 39)
Неизвестный тип данных. (рядом с nvarchar на позиции 75)
Неизвестный тип данных. (рядом с nvarchar на позиции 117)
Неизвестный тип данных. (рядом с nvarchar в позиции 161)
SQL-запрос:

СОЗДАТЬ ТАБЛИЦУ AspNetRoles ( Id nvarchar (450) NOT NULL, Name nvarchar (256) NULL, NormalizedName nvarchar (256) NULL, ConcurrencyStamp nvarchar (max) NULL, CONSTRAINT 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 (содержащие Up и Down операций) и .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (содержащие целевую модель, сильно зависящую от базы данных), которые были созданы с помощью поставщика SQL Server.

Это действительно на шаг меньше, если вы используете SQL Server. Однако он будет содержать неправильную миграцию, если вы используете какой-либо другой поставщик базы данных.

Если вы используете только MySQL, а не SQL Server, самый простой способ исправить это - сначала убедиться, что UseMySql() вызывается в вашем методе ConfigureServices :

`` С #
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 migrations добавить 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 (содержащие Up и Down операций) и .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (содержащие целевую модель, сильно зависящую от базы данных), которые были созданы с помощью поставщика SQL Server.

Это действительно на шаг меньше, если вы используете SQL Server. Однако он будет содержать неправильную миграцию, если вы используете какой-либо другой поставщик базы данных.

Если вы используете только MySQL, а не SQL Server, самый простой способ исправить это - сначала убедиться, что UseMySql() вызывается в вашем методе ConfigureServices :

`` С #
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 migrations добавить 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, чтобы мы могли обсудить любые проблемы, с которыми вы сталкиваетесь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги