9

在以前版本的实体框架中,我一直在使用 Effort ( https://effort.codeplex.com/ ) 进行单元测试。我决定为 EF Core 提供新的内存提供程序,并很快发现它不支持 OnModelCreating 中设置的 IsRequired() 和其他实体配置。有没有办法让它尊重这个配置?如果没有,这是否在要实施的待办事项列表中?甚至可能是内存提供者的替代品?

我希望能够使用测试步骤来交换上下文并在一些可以利用相同代码的集成测试场景中使用真实的数据库。这似乎是一个“很高兴拥有”,也许这就是 EF Core 努力的一个例子。我也找不到任何关于 EF Core 正在努力的信息。

我在 EF 的 Uservoice 页面上找不到任何内容(https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions),如果它不可用,我会去那里。

4

1 回答 1

5

很久以前就有人问过这个问题,但我有同样的问题,偶然发现了这个未回答的问题。我最终找到了一个适合我的答案,所以我想我会分享,以防其他人像我一样遇到这个问题。

似乎 SQLite 有一个内存选项,它比标准的 UseInMemory() 选项更像一个真正的数据库: https ://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite

唯一的区别是我添加了Microsoft.EntityFrameworkCore.Sqlite,而不是Microsoft.Data.Sqlite就像文档说的那样。

与问题不完全相关,但在我的特殊情况下,我想在测试我正在处理的 webapi 的基本功能时使用内存,但我仍然希望能够测试独特的约束等。这里是我为实现内存数据库而添加的内容。

在配置服务中:

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);
        });
});

在配置中:

if (env.IsDevelopment())
{
    var context = app.ApplicationServices.GetRequiredService<MyDbContext>();
    context.Database.EnsureCreated();
}
于 2017-08-13T02:43:23.527 回答