День 2218. #ЗаметкиНаПолях
Замечаем Забытые Миграции в Entity Framework Core
Entity Framework Core позволяет обновлять схему базы данных с помощью миграций. Миграции чаще всего создаются вручную путём запуска команды в консоли. Легко забыть создать новую миграцию при изменении модели. Чтобы убедиться, что миграции актуальны, можно написать тест, который сравнивает текущую модель с моделью снимка:
[Fact]
public async Task EnsureMigrationsAreUpToDate()
{
await using var dbCtx = new SampleDbCtx();
// Получаем нужные сервисы из контекста
var mmd = dbCtx.GetService<IMigrationsModelDiffer>();
var ma = dbCtx.GetService<IMigrationsAssembly>();
var mri = dbCtx.GetService<IModelRuntimeInitializer>();
var dtm = dbCtx.GetService<IDesignTimeModel>();
// Текущая модель
var model = dtm.Model;
// Модель снимка БД
var snapshot = ma.ModelSnapshot?.Model;
if (snapshot is IMutableModel mm)
{
// Выполняем пост-процессинг модели,
// чтобы она была готова к использованию
snapshot = mm.FinalizeModel();
}
if (snapshot is not null)
{
// Проверяем и инициализируем
// модель с зависимостями
snapshot =
mri.Initialize(snapshot);
}
// Находим различия в моделях
var diff = mmd.GetDifferences(
source: snapshot?.GetRelationalModel(),
target: model.GetRelationalModel());
// Коллекция различий должна быть пустой
Assert.Empty(diff);
}
В этом упрощённом примере мы создали контекст БД просто через new. В реальном проекте нужно будет привязать контекст к реальной базе. Как вариант, можно использовать следующий код:
var services = new ServiceCollection();
services.AddDbContext<SampleDbCtx>(
o => o.UseSqlServer(…);
using var svcProvider = services.BuildServiceProvider();
using var scope =
svcProvider
.GetRequiredService<IServiceScopeFactory>()
.CreateScope();
var dbCtx = scope
.ServiceProvider
.GetService<SampleDbCtx>();
Источник: https://www.meziantou.net/detect-missing-migrations-in-entity-framework-core.htm
>>Click here to continue<<