Ядро Entity Framework - Обязательное поле в поставщике памяти
В предыдущих версиях Entity Framework я использовал Effort ( https://effort.codeplex.com/) для модульных тестов. Я решил предоставить новый поставщик памяти для EF Core и быстро обнаружил, что он не учитывает IsRequired() и другие конфигурации сущностей, установленные в OnModelCreating. Есть ли способ заставить его соблюдать эту конфигурацию? Если нет, то есть ли это в списке задач для реализации? Может быть, даже альтернатива провайдеру памяти?
Я хотел бы иметь возможность использовать этапы тестирования, чтобы поменять контекст и использовать реальные БД в некоторых сценариях интеграционного тестирования, которые могут использовать тот же код. Это похоже на "приятно иметь", и, возможно, это тот случай, когда нужно приложить усилия с EF Core. Я также не мог найти что-либо о работе над EF Core.
Я не смог найти что-либо на странице Uservoice для EF ( https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions) и пойду туда дальше, если он просто недоступен.
1 ответ
Этот вопрос задавался довольно давно, но у меня был тот же вопрос, и я наткнулся на этот вопрос без ответа. Я закончил тем, что нашел ответ, который работает для меня, поэтому я думал, что поделюсь, если кто-то столкнется с этим, как я.
Похоже, что SQLite имеет опцию в памяти, которая действует больше как реальная база данных, чем стандартная опция UseInMemory(): https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite
Единственная разница заключалась в том, что я добавил Microsoft.EntityFrameworkCore.Sqlite, а не Microsoft.Data.Sqlite, как говорят документы.
Не совсем относится к вопросу, но в моем конкретном случае я хочу использовать память, пока я тестирую основные функции веб-интерфейса, над которым я работаю, но я все еще хочу иметь возможность тестировать уникальные ограничения и т. Д. Здесь это то, что я добавил для реализации в памяти базы данных.
В пределах Configure Services:
services.AddDbContext<MyDbContext>(options =>
{
var liteConn = new SqliteConnection("DataSource=:memory:");
liteConn.Open();
options
.UseSqlite(liteConn)
.ConfigureWarnings(warnings =>
{
warnings.Throw(RelationalEventId.QueryClientEvaluationWarning);
warnings.Log(RelationalEventId.ExecutedCommand);
});
});
В пределах Configure:
if (env.IsDevelopment())
{
var context = app.ApplicationServices.GetRequiredService<MyDbContext>();
context.Database.EnsureCreated();
}