2013-03-29 10 views
15

Podobno IMigrationMetadata.Target koduje stan modelu EF. Czy mogę użyć tego do zrekonstruowania modelu dla konkretnej migracji?Czy mogę dekodować model EntityFramework z określonej migracji?

+0

+1, chcemy uniknąć automatycznie uruchomiony migracje i zamiast je uruchomić, gdy administrator przywołuje je, więc musimy być w stanie zrekonstruować niezależnie od modelu migracji jest obecny. –

+1

Czy mógłbyś trochę rozwinąć? Na przykład gdzie i kiedy chcesz zrekonstruować model? Jaki problem chciałbyś rozwiązać? –

Odpowiedz

24

Tak, jest to możliwe. Byłem sam ciekawy, co dokładnie zapisywały te ciągi magicznych zasobów. Przez digging into the Entity Framework source (patrz metoda DbMigrator.GetLastModel()), dowiedziałem się, że IMigrationMetadata.Target po prostu przechowuje ciąg bazy-64 zawierający spakowane dane XML. Aby to sprawdzić, stworzyłem nową aplikację konsoli zawierający prosty model kodu najpierw definiuje się następująco:

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; } 
} 

Potem stworzył migracji przy użyciu Nuget konsoli Menedżer pakietów:

PM> Enable-Migrations 
PM> Add-Migration MyMigration 

Następny ja dodanej następujący kod do Main() metody mój wniosek do dekodowania wartości w tego łańcucha i zrzucić go do konsoli:

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()); 

Ten outputs an EDMX file reprezentujący model danych jednostki związany z moim DbContext, który utworzył migrację. Jeśli napiszę to wyjście do pliku z rozszerzeniem .edmx, jestem w stanie otworzyć go z Visual Studio i wyświetlić go w Entity Designer.

Następnie, jeśli z jakiegoś powodu chciałem zregenerować DbContext i podmiot klas, które produkowane model, to muszę tylko wykonać następujące czynności:

  1. Dodaj plik .edmx projektu Visual Studio.
  2. Zainstaluj urządzenie EF 5.x DbContext Generator for C#, jeśli jeszcze go nie masz.
  3. Dodaj powiązane szablony T4, wybierając Add -> New Item z menu kontekstowego węzła projektu.
  4. Zmodyfikuj nowo dodane pliki .tt, zastępując $edmxInputFile$ nazwą pliku .edmx.
  5. Zobacz, jak dwa szablony w magiczny sposób regenerują moje pierwsze typy kodu do odpowiednich plików .cs.

Mam nadzieję, że odpowiedź na Twoje pytanie! :-D

+1

Cool. Teraz wystarczy pomyśleć o konkretnej aplikacji do tego: D –

+0

Podobnie jak w przypadku wielu "problemów" programistycznych, które "rozwiązuję".";-) – luksan

+1

Świetne rzeczy @luksan, dzięki! Dla wszystkich zainteresowanych stworzyłem mały GIST, który może wyodrębnić EDMX z docelowego skrótu i ​​skompresować go ponownie: https://gist.github.com/gligoran/87fe3e8eadf5db97ad03 Używam tego, gdy muszę zmienić migrację bez zakłócania reszty łańcucha. Wydobywam EDMX z mojej migracji zmian, edytuję kod XML i kompresuję go, aby uzyskać nowy cel. Muszę to zrobić dla każdej migracji co następuje po zmianie. – gligoran

5

stworzyłem małą aplikację konsoli do eksportu EDMX z kolumny model __MigrationHistory tabeli https://github.com/andreydil/EfMigrationModelDecoder
Można wybrać konkretną migrację korzystając /migration parametr, a mianowicie:

EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init 
Powiązane problemy