![](/img/trans.png)
[英]Trying to get ef core migrations to work on project migrated to .net core 2
[英]Trying to get code migrations to work at scenario level in specflow and ef6
因此,我嘗試使用實體框架6在specflow中進行一些端到端測試。
我啟用了代碼遷移,並編寫了seed方法。 我有一個上下文工廠,可以使用受步驟定義影響的連接字符串來生成上下文。
我想要做的是在功能中,我要創建一個如下的背景步驟
Given I create a database "Admin-Test"
在此測試中,我希望刪除與數據庫的所有連接,然后刪除它,然后依靠EF6代碼遷移,然后重新創建它並使用一組已知的數據(應用程序的默認數據)播種。
對於特性中的第一種情況,這一切都很好用,但是對於其余的(當刪除數據庫時),代碼遷移不會運行以重新填充它。
我試過從DropCreateDatabaseAlways<DbContext>
繼承,並且這在第一個而不是隨后的中被命中。
我遇到的第一個問題是未創建數據庫,如果我手動執行該操作,則種子材料仍未運行(我在msdn上讀到一些有關ef不再創建db的信息,因為它使用戶感到困惑)。
所以我的問題是:如何獲得每種情況下觸發的代碼遷移? 我懷疑人們可能會更容易回答的問題是:如何在單元測試中手動觸發自動代碼遷移內容以使其運行?
額外的問題是:在每種情況下重新創建數據庫都是效率低下的-我注意到遷移會產生大量的數據庫上下方法。 如何手動運行這些代碼,然后運行種子代碼?
我個人認為您的獎金問題是潛在整體方法的一部分。 我不明白為什么SEED
和Migration
需要如此緊密地結合在一起。
與多個數據庫一起使用的基本模式。
a)默認情況下,對沒有初始化程序的數據庫使用上下文
Database.SetInitializer(new ContextInitializerNone<MYDbContext>());
var context = new MYDbContext((Tools.GetDbConnection(DataSource,DbName )),true); // pass in connection to db
b)按需遷移。 對我來說,這意味着行政觸發
public override void MigrateDb() {
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, MyMigrationConfiguration>());
Context.Database.Initialize(true);
}
c)單獨的Control Drops-管理員觸發器您可以為此使用EF。 我個人更喜歡從代碼觸發的SQL腳本。
d)觸發種子例程-管理員觸發。 例如,使用可以通過僅稱為Migrate的工具調用的常規程序。 我不喜歡嘗試從EF遷移內部啟動它。 對我來說,在調用種子時導致EF編排令人頭疼。
當然,一個管理步驟可以根據需要合並。
我使用自定義構建的遷移工作台(WPF),該工作台可以在任何數據庫上執行上述任何或所有操作。 包括新的數據庫。
我使用的一種方法是聲明[BeforeScenario]
方法並在此處創建數據庫並運行遷移,然后在[AfterScenario]
方法中刪除數據庫。 通常最好將它們放在單獨的類中以進行設置。 只要將其標記為[Binding]
類,specflow就會找到它並運行方法。
在[BeforeScenario]
我通過db上下文( ApplicationDB
)創建,然后創建數據庫
container = TestContainerFactory.SetupContainer(id);
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDb, Configuration>());
var applicationDb = container.GetInstance<ApplicationDb>();
if (applicationDb.Database.Exists()) //just in case the previous test didn't delete the old db
{
applicationDb.Database.Delete();
}
applicationDb.Database.Initialize(true);
在[AfterScenario]
刪除數據庫
var applicationDb = container.GetInstance<ApplicationDb>();
applicationDb.Database.Delete();
applicationDb.Dispose();
我遇到的唯一問題是當我使用像NCrunch這樣的多線程測試運行程序運行它時,必須確保為每種情況創建和刪除一個新數據庫,並且這些數據庫都具有唯一的名稱,我使用GUID生成。
這對我有用了一段時間,直到有太多的測試使反饋周期變得太長為止,那時我允許測試通過在IDbSet東西的IQueryable接口后面的內存集合中模擬數據庫。 我在配置中將此開關設置為可切換,以便在NCrunch運行它們的大部分時間里可以快速運行測試,然后將開關切換回針對數據庫實際運行它們,以檢查這些東西是否仍在正常運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.