簡體   English   中英

測試實體框架核心遷移

[英]Testing Entity Framework Core Migrations

您如何使用單元/集成測試來確保代碼優先遷移在填充的先前版本數據庫上正常工作,包括將 map 數據從一個列或表到另一個的任何附加代碼?

我發現了一些使用System.Data.Entity命名空間中的類的先前答案,但似乎這些已被 Entity Framework Core 過時,並且無法手動控制遷移?

我為自己找到了一個解決方案,我將發布,但我歡迎其他更好的解決方案。

該數據庫由 Context class 和 ContextModelSnapshot class、一系列遷移文件以及數據表存儲的 C# 對象定義。

如果您尚未創建遷移,請將所有這些文件復制到您的測試項目中,並使用后綴重命名所有類,例如“MyDataEntity”=>“MyDataEntityVersion1”。 相應地編輯 bundled.Design.cs 文件。 之后,在原始文件上創建新的遷移。

如果您已創建新遷移但無法后退,您可以手動編輯 ContextModelSnapshot 文件以恢復更改。

這項工作的關鍵是兩者都指向同一個數據庫文件。 一個期待原來的 state,另一個期待升級后的 state。

在您的測試用例中,您可以執行以下操作:

[TestInitialize]
public void TestInit()
{
    using (var db = new MyDataContext())
        db.Database.EnsureDeleted(); // reset database before each test
}

[TestMethod]
public void Migrate_Version1_To_Version2_On_Populated_Database()
{
    using (var db = new MyDataContextVersion1())
        db.Database.Migrate(); // create database and apply migrations up through Version 1

    // populate the Version 1 database

    App.InitializeDatabase(); // whatever method you would normally call to read/update the database

    // assert statements to test that the Version 2 database looks like you expect.
}

其中InitializeDatabase()看起來像:

public void InitializeDatabase()
{
    using (var db = new MyDataContext())
    {
        db.Database.Migrate();

        // detect if upgrade needed and set new columns

        db.SaveChanges(); 
    }
}

請注意,此解決方案的部分動機是使用 SQLite,它不支持在遷移中刪除列。 它阻止了我嘗試在遷移中做任何更花哨的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM