Ядро 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();
}
Другие вопросы по тегам