قم بتشغيل أمر 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: التوثيق
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
أثناء محاولة إعادة إنتاج # 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 الناتج ، حتى نتمكن من التحدث عن أي مشكلات تواجهها.
التعليق الأكثر فائدة
قد يحدث هذا ، إذا قمت بإنشاء مشروع 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")) ؛
تضيف هجرات dotnet ef CreateIdentitySchema