C# 同时运行的测试失败,并显示“失败”;实体类型的实例。。。“无法跟踪”;
我正在asp.net core 2.0项目上运行一些单元测试,使用EF core和内存数据库 我创建的数据库如下所示:C# 同时运行的测试失败,并显示“失败”;实体类型的实例。。。“无法跟踪”;,c#,entity-framework,unit-testing,in-memory-database,C#,Entity Framework,Unit Testing,In Memory Database,我正在asp.net core 2.0项目上运行一些单元测试,使用EF core和内存数据库 我创建的数据库如下所示: var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var builder = new DbContextOptionsBuilder<TDatabaseContext>
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
var builder = new DbContextOptionsBuilder<TDatabaseContext>();
builder.UseInMemoryDatabase(Guid.NewGuid().ToString())
.UseInternalServiceProvider(serviceProvider)
.EnableSensitiveDataLogging();
var context = new MyDatabaseContext(builder.Options);
var serviceProvider=new servicecolection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
var builder=new DbContextOptionsBuilder();
builder.UseInMemoryDatabase(Guid.NewGuid().ToString())
.UseInternalServiceProvider(serviceProvider)
.EnableSensitiveDataLogging();
var context=newmydatabasecontext(builder.Options);
根据,使用单独的服务提供者并为每个内存中的DB实例使用不同的名称应该确保每个测试都有自己的数据库,而不是与其他测试共享
但是,当我单独运行测试时,测试运行良好,但如果同时运行测试,则测试失败,错误如下:
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
var builder = new DbContextOptionsBuilder<TDatabaseContext>();
builder.UseInMemoryDatabase(Guid.NewGuid().ToString())
.UseInternalServiceProvider(serviceProvider)
.EnableSensitiveDataLogging();
var context = new MyDatabaseContext(builder.Options);
System.InvalidOperationException:无法跟踪实体类型“SomeModelObject”的实例,因为已跟踪键值为“Id:1”的另一个实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例
我还应该做些什么来确保DB上下文不会在不同的测试之间共享?你能展示一下示例测试吗?我试图创建一个简单的项目来重现这个问题,但我失败了。。。这种行为似乎非常不稳定,这是一个简单的测试,显示了设置是如何完成的以及测试是如何工作的,可能会有所帮助。我认为不需要整个项目。我不想发布整个项目,但问题是简单的测试不存在问题:/所以测试中肯定有其他错误,而不是您显示的设置。设置应该可以工作。