Entity framework core EF Core 2.1内存中数据库不更新记录
我正在使用内存中的数据库提供程序进行集成测试,但是我似乎无法更新记录。我在一个真实的SQL数据库上运行了相同的代码,所有的东西都得到了很好的更新。这是我的测试夹具代码 测试夹具: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
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);