Pomelo.entityframeworkcore.mysql: أخطاء nvarchar و nvarchar (max) مع خيار ASP.NET Core 3.0 الافتراضي وخيار الهوية

تم إنشاؤها على ٩ أكتوبر ٢٠١٩  ·  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 Identity على أخطاء. أحصل على رسائل خطأ ، عندما أحاول تنفيذ (أول جدول CREATE فقط) من البرنامج النصي في قاعدة البيانات الخاصة بي.
يبدو أن nvarchar و nvarchar (max) هما المشكلتان.

إنشاء جدول AspNetRoles (
Id nvarchar (450) ليس NULL ،
Name nvarchar (256) NULL ،
NormalizedName nvarchar (256) NULL ،
ConcurrencyStamp nvarchar (بحد أقصى) NULL ،
CONSTRAINT 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 (بحد أقصى) NULL ، CONSTRAINT PK_AspNetRoles 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.2

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. ومع ذلك ، سيحتوي على ترحيل خاطئ ، إذا كنت تستخدم أي موفر قاعدة بيانات آخر.

إذا كنت تستخدم فقط الخلية وليس كما SQL Server و أسهل طريقة لإصلاح هذا هو تأكد أولا، أن UseMySql() يطلق عليه اسم في حياتك ConfigureServices الأسلوب:

ج #
الخيارات.
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 (التي تحتوي على Up و Down ) و .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs (تحتوي على نموذج هدف يعتمد بدرجة كبيرة على قاعدة البيانات) ، تم إنشاؤها باستخدام موفر SQL Server.

هذه بالفعل خطوة أقل الاهتمام بها ، إذا كنت تستخدم SQL Server. ومع ذلك ، سيحتوي على ترحيل خاطئ ، إذا كنت تستخدم أي موفر قاعدة بيانات آخر.

إذا كنت تستخدم فقط الخلية وليس كما SQL Server و أسهل طريقة لإصلاح هذا هو تأكد أولا، أن UseMySql() يطلق عليه اسم في حياتك ConfigureServices الأسلوب:

ج #
الخيارات.
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 الناتج ، حتى نتمكن من التحدث عن أي مشكلات تواجهها.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات