Entity framework core EF Core 2.1内存中数据库不更新记录

Entity framework core EF Core 2.1内存中数据库不更新记录,entity-framework-core,Entity Framework Core,我正在使用内存中的数据库提供程序进行集成测试,但是我似乎无法更新记录。我在一个真实的SQL数据库上运行了相同的代码,所有的东西都得到了很好的更新。这是我的测试夹具代码 测试夹具: public class TestFixture<TStartup> : IDisposable { private readonly TestServer _testServer; public HttpClient TestClient { get; } public IData

我正在使用内存中的数据库提供程序进行集成测试,但是我似乎无法更新记录。我在一个真实的SQL数据库上运行了相同的代码,所有的东西都得到了很好的更新。这是我的测试夹具代码

测试夹具:

public class TestFixture<TStartup> : IDisposable
{
    private readonly TestServer _testServer;
    public HttpClient TestClient { get; }
    public IDatabaseService DbContext { get { return _testServer.Host.Services.GetService<DatabaseService>(); } }

    public TestFixture() : this(Path.Combine("src")) { }

protected TestFixture(string relativeTargetProjectPatentDir)
{
    Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Testing");

    var builder = new WebHostBuilder()
        .ConfigureServices(services =>
        {
            services.AddDbContext<DatabaseService>(options =>
                options.UseInMemoryDatabase("TestDB")
                .EnableSensitiveDataLogging());
        })
        .UseEnvironment("Testing")
        .UseStartup<Startup>();

    _testServer = new TestServer(builder)
    {
        BaseAddress = new Uri("http://localhost:5010")
    };

    TestClient = _testServer.CreateClient();
    TestClient.BaseAddress = _testServer.BaseAddress;
}

    public void Dispose()
    {
        TestClient.Dispose();
        _testServer.Dispose();
    }
}
公共类TestFixture:IDisposable
{
私有只读测试服务器TestServer;
公共HttpClient TestClient{get;}
公共IDatabaseService DbContext{get{return}testServer.Host.Services.GetService();}
publictestfixture():这个(Path.Combine(“src”){}
受保护的测试夹具(字符串相对论GetProjectPatentDir)
{
SetEnvironmentVariable(“ASPNETCORE_环境”、“测试”);
var builder=新的WebHostBuilder()
.ConfigureServices(服务=>
{
services.AddDbContext(选项=>
选项。使用MemoryDatabase(“TestDB”)
.EnableSensitiveDataLogging());
})
.UseEnvironment(“测试”)
.UseStartup();
_testServer=新的testServer(构建器)
{
BaseAddress=新Uri(“http://localhost:5010")
};
TestClient=_testServer.CreateClient();
TestClient.BaseAddress=\u testServer.BaseAddress;
}
公共空间处置()
{
TestClient.Dispose();
_Dispose();
}
}

我花了一天的大部分时间在谷歌上搜索这个问题,没有遇到任何其他人谈论它,所以我认为这可能是我的问题,而不是EF bug。我相信有人会注意到一个无法更新的DB。

结果是,将测试夹具中的DbContext的生存期更改为singleton解决了我的问题

可能是
DbContext
的使用方式不对。我也有同样的问题。我以与您相同的方式使用了
DbContext
。我只是通过
.Host.Services.GetService
返回实例。这种方法的问题是
DbContext
永远不会释放被跟踪的实体,因此要么将实体
State
设置为
EntityState.Detached
,然后强制
DbContext
重新加载它,要么使用作用域

使用(var scope=\u testServer.Host.Services.GetRequiredService().CreateScope())
{
var dbContext=scope.ServiceProvider.GetRequiredService();
//仅在范围内对dbContext执行任何操作
}

增加了克里斯的答案。以下是我所拥有的与解决问题的方法的示例:

services.AddDbContext(选项=>{
选项。使用MemoryDatabase(“TestDb”);
});

var options=new DbContextOptionsBuilder()
.UseInMemoryDatabase(数据库名称:“TestDb”)
.选择;
AddSingleton(x=>newTestDBContext(选项));

更新适用于Singleton,但我有CQRS体系结构,要检查条目是否在e2e测试中更新,我必须重新加载条目

Context.Entry(entity).Reload();

我希望这能帮助那些使用AsNoTracking行为的人在下面工作

services.AddDbContext<TestDbContext>(
            a => a.UseInMemoryDatabase(databaseName: "TestDb").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking),
            ServiceLifetime.Singleton)
然而,这似乎没有那么有效

_dbContext.Entry(existingItem).CurrentValues.SetValues(modifyItem);

我使用了相同的策略,但是我使用了一个XUnit属性(让我的测试按顺序运行):谢谢你的回答!这真的让我很困惑。我在这篇文章中添加了我根据你的回答所做的修改,以使它能够正常工作。
_dbContext.Entry(existingItem).CurrentValues.SetValues(modifyItem);