Pomelo.entityframeworkcore.mysql: nvarchar dan nvarchar(max) error dengan proyek ASP.NET Core 3.0 default dan opsi Identity

Dibuat pada 9 Okt 2019  ·  4Komentar  ·  Sumber: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Langkah-langkah untuk mereproduksi

Jalankan perintah Script-Migration.

Entity Framework Core 3.0.0 menginisialisasi 'ApplicationDbContext' menggunakan penyedia 'Pomelo.EntityFrameworkCore.MySql' dengan opsi: MaxPoolSize=128 ServerVersion 5.7.22 MySql

Masalah

Skrip SQL yang dihasilkan untuk ASP.NET Core Identity berisi kesalahan. Saya mendapatkan pesan kesalahan, ketika saya mencoba mengeksekusi (hanya CREATE TABLE pertama) dari skrip di database saya.
Tampaknya nvarchar dan nvarchar(max) adalah masalahnya.

BUAT TABEL AspNetRoles (
Id nvarchar(450) BUKAN NULL,
Name nvarchar(256) NULL,
NormalizedName nvarchar(256) NULL,
ConcurrencyStamp nvarchar(maks) NULL,
KONSTRAIN PK_AspNetRoles KUNCI UTAMA ( Id )
);

4 kesalahan ditemukan selama analisis.

Tipe data tidak dikenal. (dekat "nvarchar" di posisi 39)
Tipe data tidak dikenal. (dekat "nvarchar" di posisi 75)
Tipe data tidak dikenal. (dekat "nvarchar" di posisi 117)
Tipe data tidak dikenal. (dekat "nvarchar" di posisi 161)
kueri SQL:

BUAT TABEL 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 berkata: Dokumentasi

1064 - Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'max) NULL,

CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)

)' pada baris 5

Detail teknis lebih lanjut

Versi MySQL: 5.7.22
Sistem operasi: Windows 10
Pomelo.EntityFrameworkCore.MySql versi: 3.0.0-rc1.final
Versi Microsoft.AspNetCore.App: 3.0

closed-user-error

Komentar yang paling membantu

Ini mungkin terjadi, jika Anda membuat proyek ASP.NET Core baru (dengan opsi otentikasi diaktifkan), ubah penyedia EF Core menjadi Pomelo.EntityFrameworkCore.MySql dan kemudian jalankan perintah migrasi atau pembaruan.

Masalahnya adalah VS berasumsi bahwa Anda akan menggunakan SQL Server, jadi VS mencoba membantu Anda dan telah menambahkan migrasi awal CreateIdentitySchema ke file .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (berisi Up dan operasi Down ) dan .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (berisi model target yang sangat bergantung pada basis data), yang dihasilkan menggunakan penyedia SQL Server.

Itu memang langkah yang kurang untuk diurus, jika Anda menggunakan SQL Server. Namun, ini akan berisi migrasi yang salah, jika Anda menggunakan penyedia basis data lain.

Jika Anda hanya menggunakan MySQL dan bukan juga SQL Server, cara termudah untuk memperbaikinya adalah memastikan terlebih dahulu, bahwa UseMySql() dipanggil dalam metode ConfigureServices :

```c#
pilihan.GunakanMySql(
Konfigurasi.GetConnectionString("Koneksi Default"));

Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:

migrasi dotnet ef menambahkan 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`)
);

Semua 4 komentar

Saat mencoba mereproduksi #863, saya mendapatkan kesalahan yang sama pada perintah dotnet ef update database , yang menggunakan kelas migrasi yang sama di bawah tenda. Memeriksa ini sekarang.

Ini mungkin terjadi, jika Anda membuat proyek ASP.NET Core baru (dengan opsi otentikasi diaktifkan), ubah penyedia EF Core menjadi Pomelo.EntityFrameworkCore.MySql dan kemudian jalankan perintah migrasi atau pembaruan.

Masalahnya adalah VS berasumsi bahwa Anda akan menggunakan SQL Server, jadi VS mencoba membantu Anda dan telah menambahkan migrasi awal CreateIdentitySchema ke file .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (berisi Up dan operasi Down ) dan .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (berisi model target yang sangat bergantung pada basis data), yang dihasilkan menggunakan penyedia SQL Server.

Itu memang langkah yang kurang untuk diurus, jika Anda menggunakan SQL Server. Namun, ini akan berisi migrasi yang salah, jika Anda menggunakan penyedia basis data lain.

Jika Anda hanya menggunakan MySQL dan bukan juga SQL Server, cara termudah untuk memperbaikinya adalah memastikan terlebih dahulu, bahwa UseMySql() dipanggil dalam metode ConfigureServices :

```c#
pilihan.GunakanMySql(
Konfigurasi.GetConnectionString("Koneksi Default"));

Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:

migrasi dotnet ef menambahkan 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`)
);

Ini mungkin terjadi, jika Anda membuat proyek ASP.NET Core baru (dengan opsi otentikasi diaktifkan), ubah penyedia EF Core menjadi Pomelo.EntityFrameworkCore.MySql dan kemudian jalankan perintah migrasi atau pembaruan.

Masalahnya adalah VS berasumsi bahwa Anda akan menggunakan SQL Server, jadi VS mencoba membantu Anda dan telah menambahkan migrasi awal CreateIdentitySchema ke file .\Data\Migrations\00000000000000_CreateIdentitySchema.cs (berisi Up dan operasi Down ) dan .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (berisi model target yang sangat bergantung pada basis data), yang dihasilkan menggunakan penyedia SQL Server.

di Pomelo.EntityFrameworkCore.MySql Versi 2.2, ini berfungsi tanpa Menghapus dan membuat ulang CreateIdentitySchema,

Skrip buat tabel dihasilkan

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;

tanpa kesalahan,

Saya harap 3.0 + harus bekerja sama untuk kompatibilitas dan ketersediaan.

apakah ada alasan untuk perubahan ini?

Terima kasih,

di Pomelo.EntityFrameworkCore.MySql Versi 2.2, ini berfungsi tanpa Menghapus dan membuat ulang CreateIdentitySchema

Jika berhasil untuk Anda di Pomelo 2.2 tanpa perubahan apa pun, itu bagus, tetapi tidak dapat digeneralisasi karena sangat tergantung pada konfigurasi Anda (dan jenis kunci).

Seperti yang ditulis di atas, Anda harus membuat ulang migrasi awal saat membuat proyek baru, untuk memastikan bahwa Anda mendapatkan migrasi yang valid dan definisi model. Jika tidak, Anda sendirian dan mungkin perlu sedikit mengotak-atik kode yang dihasilkan untuk membuatnya berfungsi (ini dapat dilakukan tanpa terlalu banyak usaha tergantung pada pengetahuan MySQL Anda).

Ada beberapa perubahan yang melanggar untuk rilis 3.0 (yang harus diberi tag dengan tepat), jadi untuk peningkatan besar atau kecil apa pun, uji kode Anda terlebih dahulu di lingkungan pengembangan dan pementasan Anda sebelum memindahkannya ke produksi.

tanpa kesalahan,
[...]
apakah ada alasan untuk perubahan ini?

Kesalahan dan perubahan apa dalam 3.0 yang Anda bicarakan secara konkret?

Ada banyak perubahan dari 2.2.6 ke 3.0.0, jadi jangan ragu untuk mengirimkan kepada kami kelas model yang bermasalah, definisinya, migrasi yang dihasilkan, dan skrip SQL yang dihasilkan, sehingga kami dapat membicarakan masalah apa pun yang Anda alami.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat