TG Telegram Group & Channel
.NET Разработчик | United States America (US)
Create: Update:

День 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

День 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
10👍32


>>Click here to continue<<

.NET Разработчик




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)