C# 实体框架核心内存数据库测试在并行运行时中断
在运行所有测试时,我最终会遇到错误,如: “已添加具有相同密钥的项。密钥:125” 当每个测试单独运行时,不会发生这种情况 有趣的是,每个测试都使用不同的DbName,以避免任何冲突:C# 实体框架核心内存数据库测试在并行运行时中断,c#,.net,entity-framework,testing,entity-framework-core,C#,.net,Entity Framework,Testing,Entity Framework Core,在运行所有测试时,我最终会遇到错误,如: “已添加具有相同密钥的项。密钥:125” 当每个测试单独运行时,不会发生这种情况 有趣的是,每个测试都使用不同的DbName,以避免任何冲突: [TestMethod] public void Test1() { using (var context = CreateTestingContext()) { ... } } [TestMethod] public void Test2() { usin
[TestMethod]
public void Test1()
{
using (var context = CreateTestingContext())
{
...
}
}
[TestMethod]
public void Test2()
{
using (var context = CreateTestingContext())
{
...
}
}
protected static SGDTPContext CreateTestingContext([CallerMemberName] string dbName = "TestingDb")
{
var builder = new DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase(dbName);
return new MyDbContext(builder.Options);
}
[TestMethod]
公共void Test1()
{
使用(var context=CreateTestingContext())
{
...
}
}
[测试方法]
公共无效测试2()
{
使用(var context=CreateTestingContext())
{
...
}
}
受保护的静态SGDTPContext CreateTestingContext([CallerMemberName]string dbName=“TestingDb”)
{
var builder=new DbContextOptionsBuilder().UseInMemoryDatabase(dbName);
返回新的MyDbContext(builder.Options);
}
这真的很奇怪,因为当我单独运行测试时,它们是绿色的!当我同时运行它们时,有些最终会失败
注意:我使用的是Visual Studio 2017的集成MSTest。遇到了相同的问题,解决方案是为每个测试类使用不同的数据库名。这样做时,您在测试类中获得相同的dbcontext,但在一次运行所有测试时,它不会与不同的线程冲突
protected readonly YourDbContext _inMemoryContext;
protected readonly DbContextOptions<YourDbContext> _options;
_options = new DbContextOptionsBuilder<YourDbContext>().UseInMemoryDatabase(databaseName: "WhateverNameforClassScope").Options;
_inMemoryContext = new YourDbContext(_options);
MemoryContext中的受保护只读YourDbContext;
受保护的只读DbContextOptions\u选项;
_options=new DbContextOptionsBuilder().UseInMemoryDatabase(数据库名:“WhateverNameforClassScope”).options;
_inMemoryContext=新建YourDbContext(_选项);
VS将在多个线程中运行测试,并且您的测试方法似乎在同一个数据库上运行。还请注意,来自多个文件的测试不一定会按顺序运行,即某些类的类初始值设定项可能会在前面的测试类的类清理方法之前运行。@cassandrad[CallerMemberName]属性告诉编译器注入调用方方法的名称,因此它是“Test1”和“Test2”。您也可以尝试使用随机guid作为数据库名称,以完全排除任何数据库名称冲突。@SuperJMN您能找到解决问题的方法吗?我也为此挣扎了好几天…:S@mirind4对看来我最后用错名字了。如果您将不同的名称传递给dbName,它应该可以工作。