كيف يمكنني استخدام MigratorScriptingDecorator في كود Entity Framework أولاً؟
-
13-12-2019 - |
سؤال
لدي مشاكل في استخدام MigratorScriptingDecorator.ScriptUpdate
في إطار الكيان 4.3.1.
عند تحديد sourceMigration وtargetMigration، يتم كتابة الترحيل الأولي الخاص بي فقط، وتصبح بقية عمليات الترحيل فارغة.
لقد قمت بإدخال تقرير خطأ في Microsoft Connect يحتوي على تعليمات برمجية لإعادة الإنتاج.https://connect.microsoft.com/VisualStudio/feedback/details/731111/migratorscriptingdecorator-in-entity-framework-migrations-does-not-respect-sourcemigration-and-targetmigration
أتوقع MigratorScriptingDecorator.ScriptUpdate("from", "to")
لتتصرف تمامًا مثل أمر PM المقابل
PM> Update-Database -Script -SourceMigration from -TargetMigration to
هل يجب أن يكون ScriptUpdate مكافئًا لـ Update-Database -Script
?
هل هناك أي طرق أخرى لإنشاء البرامج النصية للتحديث من التعليمات البرمجية؟
المحلول
كما هو مذكور في مشكلة Microsoft Connect المرتبطة، كانت المشكلة هي إعادة استخدام نفس الشيء DbMigrator
على عدة MigratorScriptingDecorator
س.
وكان الرمز الأصلي
DbMigrator efMigrator = new DbMigrator(new Configuration());
var pendingMigrations = efMigrator.GetLocalMigrations().ToList();
pendingMigrations.Insert(0, "0");
foreach (var migration in pendingMigrations.Zip(pendingMigrations.Skip(1), Tuple.Create))
{
var sql = new MigratorScriptingDecorator(efMigrator).ScriptUpdate(migration.Item1, migration.Item2); // <-- problem here, the efMigrator is reused several times
Console.WriteLine("Migration from " + (migration.Item1 ?? "<null> ") + " to " + (migration.Item2 ?? "<null> "));
Console.WriteLine(sql);
Console.WriteLine("-------------------------------------");
}
ال MigratorScriptingDecorator
يجب إنشاء مثيل له خارج الحلقة مثل هذا:
DbMigrator efMigrator = new DbMigrator(new Configuration());
var pendingMigrations = efMigrator.GetLocalMigrations().ToList();
pendingMigrations.Insert(0, "0");
var scriptMigrator = new MigratorScriptingDecorator(efMigrator); // <-- now only one MigratorScriptingDecorator is created for the DbMigrator
foreach (var migration in pendingMigrations.Zip(pendingMigrations.Skip(1), Tuple.Create))
{
var sql = scriptMigrator.ScriptUpdate(migration.Item1, migration.Item2);
Console.WriteLine("Migration from " + (migration.Item1 ?? "<null> ") + " to " + (migration.Item2 ?? "<null> "));
Console.WriteLine(sql);
Console.WriteLine("-------------------------------------");
}