Подтвердить что ты не робот

Могу ли я получить декодирование модели EntityFramework из указанной миграции?

По-видимому, IMigrationMetadata.Target кодирует состояние модели EF. Могу ли я использовать это для восстановления модели для конкретной миграции?

4b9b3361

Ответ 1

Да, это возможно. Мне было любопытно, что именно хранят эти магические строки ресурсов. перекопав в источник Entity Framework (см. Метод DbMigrator.GetLastModel()), я обнаружил, что IMigrationMetadata.Target просто хранит строку base-64, содержащую gzipped XML-данные. Чтобы проверить это, я создал новое консольное приложение, содержащее простую модель кода, определенную следующим образом:

public class ContactContext : DbContext
{
    public virtual IDbSet<Contact> Contacts { get; set; }
}

public class Contact 
{
    public int Id {get; set;}
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Затем я создал миграцию с помощью консоли диспетчера пакетов NuGet:

PM> Enable-Migrations
PM> Add-Migration MyMigration

Далее я добавил следующий код в мой метод приложения Main(), чтобы декодировать значение в этой строке и выгрузить его на консоль:

var migration = new MyMigration();
var metadata = (IMigrationMetadata)migration;
var compressedBytes = Convert.FromBase64String(metadata.Target);
var memoryStream = new MemoryStream(compressedBytes);
var gzip = new GZipStream(memoryStream, CompressionMode.Decompress);
var reader = new StreamReader(gzip);
Console.WriteLine(reader.ReadToEnd());

Этот выводит файл EDMX, представляющий собой модель данных сущности, связанную с моей DbContext, которая создала миграцию. Если я напишу этот вывод в файл с расширением .edmx, я могу открыть его с помощью Visual Studio и просмотреть его в Entity Designer.

Затем, если по какой-то причине я захотел регенерировать классы DbContext и сущности, которые создали модель, мне нужно было бы сделать только следующее:

  • Добавьте файл .edmx в проект Visual Studio.
  • Установите EF 5.x DbContext Generator для С#, если у меня его еще нет.
  • Добавьте связанные шаблоны T4, выбрав Add -> New Item из контекстного меню node.
  • Измените недавно добавленные .tt файлы, заменив $edmxInputFile$ на имя моего файла .edmx.
  • Посмотрите, как два шаблона волшебным образом меняют мои кодовые типы в соответствующие файлы .cs.

Надеюсь, что ответит на ваш вопрос!:-D

Ответ 2

Я создал небольшое консольное приложение для экспорта EDMX из столбца Model таблицы __MigrationHistory https://github.com/andreydil/EfMigrationModelDecoder
Вы можете выбрать конкретную миграцию, используя параметр /migration, i.e:

EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init