База данных определяется классом Context и классом ContextModelSnapshot, серией файлов миграции и объектами C #, которые хранятся в таблицах данных.
Если вы еще не создали миграцию, скопируйте всеиз этих файлов в ваш тестовый проект и переименуйте все классы с суффиксом, например, «MyDataEntity» => «MyDataEntityVersion1».Отредактируйте связанные файлы .Design.cs соответственно.После этого создайте новую миграцию на исходной.
Если вы создали новую миграцию, но не можете вернуться назад, вы можете вручную отредактировать файл ContextModelSnapshot, чтобы отменить изменения.
Ключк этой работе относится то, что оба указывают на один и тот же файл базы данных.Один ожидает исходного состояния, а другой ожидает обновленного состояния.
В вашем тестовом примере вы можете выполнить:
[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, который не поддерживает удаление столбцов в процессе миграции.Это отговорило меня от попыток сделать что-то более причудливое в миграциях.