كيف يمكنني استخدام MigratorScriptingDecorator في كود Entity Framework أولاً؟

StackOverflow https://stackoverflow.com//questions/9701781

سؤال

لدي مشاكل في استخدام 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("-------------------------------------");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top