Pomelo.entityframeworkcore.mysql: إعادة تسمية الكيان

تم إنشاؤها على ٢٠ فبراير ٢٠٢٠  ·  3تعليقات  ·  مصدر: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

ستؤدي إعادة تسمية الكيان إلى إفلات الجدول وإنشاء الجدول بدلاً من إعادة تسميته فقط.

closed-question type-question

التعليق الأكثر فائدة

هذا هو قيد متأصل في EF ، وليس بوميلو مباشرة. لا تستطيع EF عادةً التمييز بين إسقاط / إنشاء جدول وإعادة تسمية.

الحيلة لإخباره بأنه إعادة تسمية هي تعيين اسم الجدول يدويًا ، إما عبر سمة في فئة الكيان ، أو عبر واجهة برمجة تطبيقات OnModelCreating بطلاقة.

التسلسل مثل:

  1. باستخدام اسم الكيان الأصلي ، قم بتعيين اسم الجدول على القيمة الجديدة. حاول التأكد من صحة هذا الاسم الجديد للكيان الجديد ، أو قد ينتهي بك الأمر بترحيل إضافي.

على سبيل المثال ، builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. توليد الهجرة. سيؤدي هذا إلى إنشاء ترحيل جدول إعادة التسمية الصحيح للكيان.
    تحقق من صحة هذا الترحيل. إذا كنت تستخدم Pomelo 2.2.6 ، فتحقق من إدخالات migrationBuilder.DropPrimaryKey و AddPrimaryKey واحذفها ، لأن هذه ليست ضرورية لـ MySQL وستتسبب في حدوث مشكلات في إنشاء نصوص SQL غير فعالة. تم إصلاح هذا في 3.1.

  2. أعد تسمية فئة الكيان الفعلي.

  3. قم بإنشاء ترحيل آخر لتحديث لقطة النموذج بأسماء الكيانات الجديدة.

إذا كنت تريد بعد ذلك إزالة .ToTable("RenamedEntity"); للرجوع إلى تسمية الجدول على أساس الاصطلاح:

  1. قم بإزالة .ToTable("RenamedEntity"); . إذا حصلت على اسم الجدول بشكل صحيح ، فيجب أن يكون الاسم المستند إلى الاصطلاح هو نفسه الاسم الحالي.

  2. قم بإنشاء ترحيل نهائي للتحقق من عدم إعادة تسمية الجدول مرة أخرى. إذا كان الأمر كذلك ، فارجع إلى جميع الخطوات وصحح الاسم وأعد. إذا كان الترحيل فارغًا ، يمكنك التراجع عنه.

ما زلت أختبرها ، ولكن ربما يمكنك القيام بذلك بالترتيب العكسي. بمعنى آخر:

  1. أعد تسمية الكيان ، وأضف .ToTable مع اسم الجدول الحالي
  2. توليد الهجرة.
  3. قم بإزالة السمة .ToTable
  4. توليد هجرة أخرى.

لمزيد من المعلومات ، راجع سؤال تجاوز سعة المكدس هذا:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

ال 3 كومينتر

هذا هو قيد متأصل في EF ، وليس بوميلو مباشرة. لا تستطيع EF عادةً التمييز بين إسقاط / إنشاء جدول وإعادة تسمية.

الحيلة لإخباره بأنه إعادة تسمية هي تعيين اسم الجدول يدويًا ، إما عبر سمة في فئة الكيان ، أو عبر واجهة برمجة تطبيقات OnModelCreating بطلاقة.

التسلسل مثل:

  1. باستخدام اسم الكيان الأصلي ، قم بتعيين اسم الجدول على القيمة الجديدة. حاول التأكد من صحة هذا الاسم الجديد للكيان الجديد ، أو قد ينتهي بك الأمر بترحيل إضافي.

على سبيل المثال ، builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. توليد الهجرة. سيؤدي هذا إلى إنشاء ترحيل جدول إعادة التسمية الصحيح للكيان.
    تحقق من صحة هذا الترحيل. إذا كنت تستخدم Pomelo 2.2.6 ، فتحقق من إدخالات migrationBuilder.DropPrimaryKey و AddPrimaryKey واحذفها ، لأن هذه ليست ضرورية لـ MySQL وستتسبب في حدوث مشكلات في إنشاء نصوص SQL غير فعالة. تم إصلاح هذا في 3.1.

  2. أعد تسمية فئة الكيان الفعلي.

  3. قم بإنشاء ترحيل آخر لتحديث لقطة النموذج بأسماء الكيانات الجديدة.

إذا كنت تريد بعد ذلك إزالة .ToTable("RenamedEntity"); للرجوع إلى تسمية الجدول على أساس الاصطلاح:

  1. قم بإزالة .ToTable("RenamedEntity"); . إذا حصلت على اسم الجدول بشكل صحيح ، فيجب أن يكون الاسم المستند إلى الاصطلاح هو نفسه الاسم الحالي.

  2. قم بإنشاء ترحيل نهائي للتحقق من عدم إعادة تسمية الجدول مرة أخرى. إذا كان الأمر كذلك ، فارجع إلى جميع الخطوات وصحح الاسم وأعد. إذا كان الترحيل فارغًا ، يمكنك التراجع عنه.

ما زلت أختبرها ، ولكن ربما يمكنك القيام بذلك بالترتيب العكسي. بمعنى آخر:

  1. أعد تسمية الكيان ، وأضف .ToTable مع اسم الجدول الحالي
  2. توليد الهجرة.
  3. قم بإزالة السمة .ToTable
  4. توليد هجرة أخرى.

لمزيد من المعلومات ، راجع سؤال تجاوز سعة المكدس هذا:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

في الأساس ، هناك استدلالات مطبقة ، يمكنها اكتشاف إعادة تسمية الجدول في بعض الحالات.

لكن إعادة التسمية هي إحدى تلك العمليات ، حيث تريد بالتأكيد التحقق من رمز الترحيل الذي تم إنشاؤه بعد ذلك وتغيير مكالمات DropTable و CreateTable إلى RenameTable عند الضرورة.

قام EF Core بإعادة تسمية الجدول تمامًا مثل عمليات الترحيل التي تم إنشاؤها تلقائيًا.

        migrationBuilder.DropPrimaryKey(
            name: "PK_LogFieldsConfiguration",
            table: "LogFieldsConfiguration");

        migrationBuilder.RenameTable(
            name: "LogFieldsConfiguration",
            newName: "LogFieldsConfigurations");

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات