我们的集成测试中的多个数据库上下文似乎间歇性地失败并且添加 ToList() 并不能解决它
Multiple database contexts in our integration test seems to fail intermittently and adding ToList() doesn't fix it
我在同事的集成测试 运行 作为单元测试时遇到间歇性问题。有时它在我的机器上工作,有时它不工作,尽管当它停止工作时,它似乎保持 'stuck' 一段时间不工作。我也不知道如何让它再次工作。
当我尝试调试它时,错误出现在第二个 DBContext (ctx1) 中 - 它错误地说:
Message='MyCollection' 上的 'UpdatedOn' 属性 无法设置为 'null' 值。您必须将此 属性 设置为 'System.DateTime' 类型的非空值。
来源=EntityFramework
collection.Local里面只有一个项目 - 这是在之前的上下文中添加的新项目。
collection.ResultsView - 当我尝试枚举收集结果时出现另一个错误:
"There is already an open DataReader associated with this Command which must be closed first."
MyDBContext 最终基于 EF6 DbContext。
public void CanAddItem()
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required,
new TimeSpan(0, 15, 0),
TransactionScopeAsyncFlowOption.Enabled))
{
int initialCount;
// Arrange
using (IMyDBContext ctx = new MyDBContext(new AppConfigReader()))
{
var matched = ctx.MyCollection;
initialCount = matched.Count();
var item = new MyItem
{
UpdatedOn = DateTime.Now;
};
// Act
ctx.MyCollection.Add(item);
ctx.SaveChanges();
}
//Assert
using (IMyDBContext ctx1 = new MyDBContext(new AppConfigReader()))
{
var collection = ctx1.MyCollection;
collection.Should().HaveCount(initialCount + 1);
}
}
我尝试添加 .ToList()
来生成 var collection = ctx1.MyCollection.ToList()
,但它只是将错误移到了该行代码中。
我认为他使用两个上下文的理由是为了证明值始终写入数据库并且不会卡在 DbContext 中。它总是在他的机器上运行。
我需要让它一直工作。任何帮助将不胜感激。
因为世界必须看到我愚蠢的错误。我终于 运行 SQL 查询让我意识到实体定义与数据库定义不同,而且在我的数据库中,不时地,值 UpdatedOn为空!
经验教训。
我在同事的集成测试 运行 作为单元测试时遇到间歇性问题。有时它在我的机器上工作,有时它不工作,尽管当它停止工作时,它似乎保持 'stuck' 一段时间不工作。我也不知道如何让它再次工作。
当我尝试调试它时,错误出现在第二个 DBContext (ctx1) 中 - 它错误地说:
Message='MyCollection' 上的 'UpdatedOn' 属性 无法设置为 'null' 值。您必须将此 属性 设置为 'System.DateTime' 类型的非空值。 来源=EntityFramework
collection.Local里面只有一个项目 - 这是在之前的上下文中添加的新项目。
collection.ResultsView - 当我尝试枚举收集结果时出现另一个错误: "There is already an open DataReader associated with this Command which must be closed first."
MyDBContext 最终基于 EF6 DbContext。
public void CanAddItem()
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required,
new TimeSpan(0, 15, 0),
TransactionScopeAsyncFlowOption.Enabled))
{
int initialCount;
// Arrange
using (IMyDBContext ctx = new MyDBContext(new AppConfigReader()))
{
var matched = ctx.MyCollection;
initialCount = matched.Count();
var item = new MyItem
{
UpdatedOn = DateTime.Now;
};
// Act
ctx.MyCollection.Add(item);
ctx.SaveChanges();
}
//Assert
using (IMyDBContext ctx1 = new MyDBContext(new AppConfigReader()))
{
var collection = ctx1.MyCollection;
collection.Should().HaveCount(initialCount + 1);
}
}
我尝试添加 .ToList()
来生成 var collection = ctx1.MyCollection.ToList()
,但它只是将错误移到了该行代码中。
我认为他使用两个上下文的理由是为了证明值始终写入数据库并且不会卡在 DbContext 中。它总是在他的机器上运行。
我需要让它一直工作。任何帮助将不胜感激。
因为世界必须看到我愚蠢的错误。我终于 运行 SQL 查询让我意识到实体定义与数据库定义不同,而且在我的数据库中,不时地,值 UpdatedOn为空!
经验教训。