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?
Odpowiedz
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:
- Dodaj plik
.edmx
projektu Visual Studio. - Zainstaluj urządzenie EF 5.x DbContext Generator for C#, jeśli jeszcze go nie masz.
- Dodaj powiązane szablony T4, wybierając
Add -> New Item
z menu kontekstowego węzła projektu. - Zmodyfikuj nowo dodane pliki
.tt
, zastępując$edmxInputFile$
nazwą pliku.edmx
. - 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
Cool. Teraz wystarczy pomyśleć o konkretnej aplikacji do tego: D –
Podobnie jak w przypadku wielu "problemów" programistycznych, które "rozwiązuję".";-) – luksan
Ś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
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
stworzyłem skrypt PowerShell aby wyodrębnić ostatnią migrację z bazy danych do pliku edmx.
https://gist.github.com/otto-gebb/93d021c8fd300646dba0073a77585a94
- 1. EntityFramework zmiana model częściowy
- 2. Jak korzystać z migracji programowo w EntityFramework Codefirst?
- 3. EntityFramework Migration cascadeDelete Parametr
- 4. Elm: Jak dekodować dane z JSON API
- 5. Migracja z DataSets do EntityFramework
- 6. Jak mogę dekodować ciągi kodowane base64?
- 7. Jak mogę dekodować token JWT w Androidzie?
- 8. Czy mogę skonfigurować przechwytywacz jeszcze w EntityFramework Core 1.0 rc2?
- 9. Czy mogę uruchomić model Keras na GPU?
- 10. Skąd mogę wiedzieć, czy obiekt pochodzi z określonej klasy ogólnej?
- 11. Jak mogę przetestować jednostkę migracji danych podstawowych?
- 12. Czy mogę wiedzieć, czy obraz jest przezroczysty w określonej pozycji?
- 13. SqlDependency z EntityFramework 6 (asynchroniczny)
- 14. EntityFramework i ReadOnlyCollection
- 15. Czy istnieje prosty sposób na poinformowanie alembika o migracji do określonej wersji?
- 16. EntityFramework nie tworzy tabel
- 17. Obsługa migracji z MongoDb
- 18. CASE vs. dekodować
- 19. Czy flask-peewee do migracji?
- 20. Czy mogę mieć 2 różne konteksty EntityFramework współdzielić pojedynczą bazę danych SqlServer Compact?
- 21. Jak mogę uniknąć migracji w RealmSwift
- 22. laravel - wymowny - get sumy określonej kolumny Powiązany model
- 23. Jak mogę dekodować certyfikat SSL za pomocą pythona?
- 24. Pobierz typ bazy danych z EntityFramework `DbContext`
- 25. Narzędzie do zarządzania migracją NHibernate, takie jak EntityFramework, Django-South
- 26. Migracja EntityFramework Określ web.config
- 27. jak kodować/dekodować prosty ciąg
- 28. Codeigniter: jak mogę sprawdzić, czy model jest już załadowany?
- 29. Zliczanie EntityFramework wyników zapytania z listą zliczania
- 30. EntityFramework - Błąd proxy jednostki
+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. –
Czy mógłbyś trochę rozwinąć? Na przykład gdzie i kiedy chcesz zrekonstruować model? Jaki problem chciałbyś rozwiązać? –