По-видимому, IMigrationMetadata.Target кодирует состояние модели EF. Могу ли я использовать это для восстановления модели для конкретной миграции?
Могу ли я получить декодирование модели EntityFramework из указанной миграции?
Ответ 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
Ответ 3
Я создал PowerShell script, чтобы извлечь последнюю миграцию из базы данных в edmx файл.
https://gist.github.com/otto-gebb/93d021c8fd300646dba0073a77585a94