首页 > 解决方案 > 我们的集成测试中的多个数据库上下文似乎间歇性失败,添加 ToList() 并不能解决它

问题描述

我在作为单元测试运行的同事的集成测试中遇到间歇性问题。有时它可以在我的机器上运行,有时它不起作用,尽管当它停止工作时,它似乎一直“卡住”了一段时间不工作。我也没有弄清楚如何让它再次工作。

当我尝试调试它时,错误出现在第二个 DBContext (ctx1) 中 - 它错误地说:

  1. Message=“MyCollection”上的“UpdatedOn”属性无法设置为“null”值。您必须将此属性设置为“System.DateTime”类型的非空值。来源=实体框架

  2. collection.Local 中只有一个项目 - 这是在前一个上下文中添加的新项目。

  3. collection.ResultsView - 当我尝试枚举收集结果时,出现另一个错误:“已经有一个打开的 DataReader 与此命令关联,必须先关闭。”

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()到 makevar collection = ctx1.MyCollection.ToList()但它只是将错误移动到那行代码中。

我认为他使用两个上下文的理由是证明该值始终写入数据库并且不会卡在 DbContext 中。它总是在他的机器上运行。

我需要让它工作,所以它一直工作。任何帮助将不胜感激。

标签: c#entity-frameworkentity-framework-6dbcontext

解决方案


因为世界必须看到我愚蠢的错误。我终于运行了 SQL 查询,这让我意识到实体定义与数据库定义不同,而且在我的数据库中,有时会出现 UpdatedOn 为 NULL 的值!

得到教训。


推荐阅读