顯然,IMigrationMetadata.Target對EF模型的狀態進行編碼。 我可以使用它來重建特定遷移的模型嗎?我可以從指定的遷移中解碼EntityFramework模型嗎?
15
A
回答
24
是的,這是可能的。我很好奇這些神奇的資源字符串正在存儲什麼。通過digging into the Entity Framework source(請參閱DbMigrator.GetLastModel()
方法),我發現IMigrationMetadata.Target
只存儲包含經過gzip壓縮的XML數據的base-64字符串。爲了測試這一點,我創建包含定義的簡單代碼優先模型的新的控制檯應用程序如下:
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());
這outputs an EDMX file表示與創建遷移的我的DbContext
關聯的實體數據模型。如果我把這個輸出寫到一個擴展名爲.edmx
的文件中,我可以用Visual Studio打開它並在Entity Designer中查看它。
然後,如果由於某種原因,我想重新產生該模型DbContext
和實體類,我只需要做到以下幾點:
- 的
.edmx
文件添加到Visual Studio項目。 - 如果我還沒有安裝EF 5.x DbContext Generator for C#。
- 通過從項目節點上下文菜單中選擇
Add -> New Item
來添加相關的T4模板。 - 修改新添加的
.tt
文件,用我的.edmx
文件的名稱替換$edmxInputFile$
。 - 觀看這兩個模板神奇地將我的代碼優先類型重新生成到它們各自的
.cs
文件。
希望能回答你的問題! :-D
5
我創建了一個小型控制檯應用程序從__MigrationHistory表https://github.com/andreydil/EfMigrationModelDecoder
的模型列出口EDMX您可以選擇特定遷移使用/migration
參數,即:
EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init
1
我創建了一個PowerShell腳本從數據庫提取最新的遷移到edmx文件。
https://gist.github.com/otto-gebb/93d021c8fd300646dba0073a77585a94
相關問題
- 1. EntityFramework遷移指定web.config
- 2. 我可以從模型代碼中調用指定範圍嗎?
- 3. EntityFramework可以支持EAV模型嗎?
- 4. C#我可以從EntityFramework擴展IdentityMessage嗎?
- 5. 我可以刪除遷移文件嗎?
- 6. 我可以刪除遷移文件嗎?
- 7. Can Flyway可以從數據模型中找出並生成遷移文件嗎?
- 8. 的EntityFramework代碼優先遷移
- 9. 我可以指定Ember js模型上的商店嗎?
- 10. 我可以從泛型類繼承而不指定類型嗎?
- 11. 合併模型可以使用輕量數據遷移嗎?
- 12. 禁用EntityFrameWork遷移
- 13. 我可以從模型中獲取綁定元素的id嗎?
- 14. c#EntityFramework CodeFirst遷移爲我的數據庫模型中現有的一個
- 15. 我可以從DTS遷移到等效的MySQL工具嗎?
- 16. TFS 2010,我可以只遷移源代碼嗎?
- 17. 刪除特定的EntityFramework遷移
- 18. 我可以刪除遷移目錄中的django遷移文件嗎
- 19. 指定遷移
- 20. 我可以爲現有模型創建初始遷移
- 21. 我可以從.sql創建初始CodeIgniter數據庫遷移嗎?
- 22. 我可以無縫地從Firebase Auth遷移用戶嗎?
- 23. 我可以從PHP 5.3.10遷移到PHP 5.6.0嗎?
- 24. 我們可以從VSS - > TFS遷移PL/SQL文件嗎?
- 25. 如何阻止EntityFramework遷移自動創建我的模式?
- 26. 從數據集遷移到EntityFramework
- 27. 我可以爲laravel中的模型方法指定不同的mysql連接嗎?
- 28. 基於EntityFramework代碼的遷移,如何確定訂單?
- 29. 我可以在Xaml中指定DataGrid項目的類型嗎?
- 30. 我可以在GtkListStore中存儲未指定的類型嗎?
+1,我們要避免自動,而是運行的遷移運行它們時,管理員調用它們,所以我們需要能夠重建模型無論從任何當前的遷移。 –
能否詳細說明一下?像你想在何時何地重建模型?你想解決什麼問題? –