Pomelo.entityframeworkcore.mysql: nvarchar- und nvarchar(max)-Fehler mit standardmäßigem ASP.NET Core 3.0-Projekt und Identitätsoption

Erstellt am 9. Okt. 2019  ·  4Kommentare  ·  Quelle: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Schritte zum Reproduzieren

Führen Sie den Befehl Skriptmigration aus.

Entity Framework Core 3.0.0 initialisierte 'ApplicationDbContext' unter Verwendung des Anbieters 'Pomelo.EntityFrameworkCore.MySql' mit Optionen: MaxPoolSize=128 ServerVersion 5.7.22 MySql

Das Thema

Das generierte SQL-Skript für ASP.NET Core Identity enthält Fehler. Ich erhalte Fehlermeldungen, wenn ich versuche (nur das erste CREATE TABLE) des Skripts in meiner Datenbank auszuführen.
Scheint, dass nvarchar und nvarchar(max) die Probleme sind.

TABELLE ERSTELLEN AspNetRoles (
Id nvarchar(450) NICHT NULL,
Name nvarchar(256) NULL,
NormalizedName nvarchar(256) NULL,
ConcurrencyStamp nvarchar(max) NULL,
EINSCHRÄNKUNG PK_AspNetRoles PRIMÄRSCHLÜSSEL ( Id )
);

Bei der Analyse wurden 4 Fehler gefunden.

Unbekannter Datentyp. (in der Nähe von "nvarchar" an Position 39)
Unbekannter Datentyp. (in der Nähe von "nvarchar" an Position 75)
Unbekannter Datentyp. (in der Nähe von "nvarchar" an Position 117)
Unbekannter Datentyp. (in der Nähe von "nvarchar" an Position 161)
SQL-Abfrage:

CREATE TABLE AspNetRoles ( Id nvarchar(450) NICHT NULL, Name nvarchar(256) NULL, NormalizedName nvarchar(256) NULL, ConcurrencyStamp nvarchar(max) NULL, CONSTRAINT PK_AspNetRoles PRIMÄRSCHLÜSSEL ( Id )

MySQL sagte: Dokumentation

1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax in der Nähe von 'max) NULL zu verwenden.

CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)

)' in Zeile 5

Weitere technische Details

MySQL-Version: 5.7.22
Betriebssystem: Windows 10
Pomelo.EntityFrameworkCore.MySql-Version: 3.0.0-rc1.final
Microsoft.AspNetCore.App-Version: 3.0

closed-user-error

Hilfreichster Kommentar

Dies kann passieren, wenn Sie ein neues ASP.NET Core-Projekt erstellen (mit aktivierter Authentifizierungsoption), den EF Core-Anbieter in Pomelo.EntityFrameworkCore.MySql ändern und dann einen Migrations- oder Updatebefehl ausführen.

Das Problem ist, dass VS davon ausgegangen ist, dass Sie SQL Server verwenden werden, also hat es versucht, Ihnen zu helfen und hat bereits die anfängliche Migration CreateIdentitySchema zu den Dateien .\Data\Migrations\00000000000000_CreateIdentitySchema.cs hinzugefügt (die die Up und Down Operationen) und .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (die das stark datenbankabhängige Zielmodell enthalten), die mit dem SQL Server-Anbieter generiert wurden.

Das ist in der Tat ein Schritt weniger zu beachten, wenn Sie SQL Server verwenden. Es enthält jedoch eine falsche Migration, wenn Sie einen anderen Datenbankanbieter verwenden.

Wenn Sie nur MySQL und nicht auch SQL Server verwenden, können Sie dies am einfachsten beheben, indem Sie zunächst sicherstellen, dass UseMySql() in Ihrer ConfigureServices Methode aufgerufen wird:

```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-Migrationen fügen CreateIdentitySchema hinzu

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`)
);

Alle 4 Kommentare

Beim Versuch, #863 zu reproduzieren, erhalte ich den gleichen Fehler beim Befehl dotnet ef update database , der die gleichen Migrationsklassen unter der Haube verwendet. Prüfe das jetzt.

Dies kann passieren, wenn Sie ein neues ASP.NET Core-Projekt erstellen (mit aktivierter Authentifizierungsoption), den EF Core-Anbieter in Pomelo.EntityFrameworkCore.MySql ändern und dann einen Migrations- oder Updatebefehl ausführen.

Das Problem ist, dass VS davon ausgegangen ist, dass Sie SQL Server verwenden werden, also hat es versucht, Ihnen zu helfen und hat bereits die anfängliche Migration CreateIdentitySchema zu den Dateien .\Data\Migrations\00000000000000_CreateIdentitySchema.cs hinzugefügt (die die Up und Down Operationen) und .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (die das stark datenbankabhängige Zielmodell enthalten), die mit dem SQL Server-Anbieter generiert wurden.

Das ist in der Tat ein Schritt weniger zu beachten, wenn Sie SQL Server verwenden. Es enthält jedoch eine falsche Migration, wenn Sie einen anderen Datenbankanbieter verwenden.

Wenn Sie nur MySQL und nicht auch SQL Server verwenden, können Sie dies am einfachsten beheben, indem Sie zunächst sicherstellen, dass UseMySql() in Ihrer ConfigureServices Methode aufgerufen wird:

```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-Migrationen fügen CreateIdentitySchema hinzu

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`)
);

Dies kann passieren, wenn Sie ein neues ASP.NET Core-Projekt erstellen (mit aktivierter Authentifizierungsoption), den EF Core-Anbieter in Pomelo.EntityFrameworkCore.MySql ändern und dann einen Migrations- oder Updatebefehl ausführen.

Das Problem ist, dass VS davon ausgegangen ist, dass Sie SQL Server verwenden werden, also hat es versucht, Ihnen zu helfen und hat bereits die anfängliche Migration CreateIdentitySchema zu den Dateien .\Data\Migrations\00000000000000_CreateIdentitySchema.cs hinzugefügt (die die Up und Down Operationen) und .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (die das stark datenbankabhängige Zielmodell enthalten), die mit dem SQL Server-Anbieter generiert wurden.

in Pomelo.EntityFrameworkCore.MySql Version 2.2 funktioniert es ohne Löschen und Erstellen von CreateIdentitySchema,

Das erzeugte Skript zur Tabellenerstellung

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;

ohne Fehler,

Ich hoffe, 3.0+ sollte aus Kompatibilitäts- und Verfügbarkeitsgründen genauso funktionieren.

gibt es einen grund für diese änderung?

Danke,

in Pomelo.EntityFrameworkCore.MySql Version 2.2 funktioniert es ohne Löschen und Erstellen von CreateIdentitySchema

Wenn es in Pomelo 2.2 ohne Änderungen für Sie funktioniert hat, ist das großartig, kann aber nicht verallgemeinert werden, da es stark von Ihrer Konfiguration (und Ihrem Tastentyp) abhängt.

Wie oben beschrieben, sollten Sie beim Erstellen eines neuen Projekts die anfängliche Migration neu generieren, um sicherzustellen, dass Sie eine gültige Migrations- und Modelldefinition erhalten. Wenn Sie dies nicht tun, sind Sie auf sich allein gestellt und müssen möglicherweise ein wenig am generierten Code herumbasteln, damit er funktioniert (dies ist je nach Ihren MySQL-Kenntnissen ohne großen Aufwand möglich).

Es gab einige grundlegende Änderungen für die Version 3.0 (die entsprechend gekennzeichnet werden sollten). Testen Sie Ihren Code daher bei jedem größeren oder kleineren Upgrade zuerst in Ihrer Entwicklungs- und Stagingumgebung, bevor Sie ihn in die Produktion überführen.

ohne Fehler,
[…]
gibt es einen grund für diese änderung?

Von welchen Fehlern und Änderungen in 3.0 sprichst du konkret?

Es gab viele Änderungen von 2.2.6 auf 3.0.0, also zögern Sie nicht, uns eine problematische Modellklasse, ihre Definition, die generierte Migration und das resultierende SQL-Skript zu posten, damit wir über alle Probleme sprechen können, die Sie haben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen