实体框架核心 - 在内存提供程序必需字段中

Mat*_*ers 7 entity-framework-core effort

在先前版本的Entity Framework中,我一直在使用Effort(https://effort.codeplex.com/)进行单元测试.我决定为EF Core提供新的内存提供程序,并很快发现它不支持在OnModelCreating中设置的IsRequired()和其他实体配置.有没有办法让它尊重这种配置?如果没有,这是否在todo列表上实现?甚至可能是内存提供商的另类选择?

我希望能够使用测试步骤来交换上下文,并在一些可以利用相同代码的集成测试场景中使用真正的数据库.这似乎是"很高兴",也许这就是EF Core的努力.我找不到任何关于为EF Core工作的努力.

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

小智 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);
        });
});
Run Code Online (Sandbox Code Playgroud)

在配置中:

if (env.IsDevelopment())
{
    var context = app.ApplicationServices.GetRequiredService<MyDbContext>();
    context.Database.EnsureCreated();
}
Run Code Online (Sandbox Code Playgroud)