ObjectContext 已被 EnsureConnection() 在连续查询中抛出(未使用导航属性和 using(

本文关键字:未使用 导航 属性 using 查询 EnsureConnection 已被 ObjectContext 连续 | 更新日期: 2023-09-27 18:34:40

>EF以某种方式在两个查询之间释放了ObjectContext,没有任何进一步的通知,但显然不是随机的,也不是由于超时。

我添加了 using ,因此该示例是自包含的,但它对整个应用程序中使用的 DbContext 执行相同的操作。

using (MyDbContext db = new MyDbContext ())
{
  //I am sure these are unique
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane");
  Node node = db.Nodes.Single(n => n.ShortName == "stuff"); //Here the request throws
  // "ObjectContext instance has been disposed and can no longer be used for operations that require a connection"
}

请注意db尚未通过使用来释放,因此这是不可能的。错误也发生在 .First().Where().Single/First() .

反转两个请求并不能解决问题:

using (MyDbContext db = new MyDbContext ())
{
  Node node = db.Nodes.Single(n => n.ShortName == "stuff");
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane"); //Here the request throws
  // "ObjectContext instance has been disposed and can no longer be used for operations that require a connection"
}

我也没有使用员工的任何导航属性,这并不能解决问题:

using (MyDbContext db = new MyDbContext ())
{
  // According to every post I've found this "should fix the objectcontext disposed error"
  db.Configuration.ProxyCreationEnabled = false;
  db.Configuration.LazyLoadingEnabled = false;
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane");
  Node node = db.Nodes.Single(n => n.ShortName == "stuff"); //But it doesn't: same error here
}

我注意到的是,这个问题不会发生在网站项目中,而只会发生在 UnitTests 项目中。我已经为两者设置了相同的连接字符串(除了数据库名称(,但这也没有做任何事情。

更糟糕的是:

using (MyDbContext db = new MyDbContext ())
{
  Node node = db.Nodes.Single(n => n.ShortName == "stuff");
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane"); // boom
  node.Should().NotBeNull();
}
using (MyDbContext db = new MyDbContext ())
{
  Node node = db.Nodes.Single(n => n.ShortName == "stuff");
  node.Should().NotBeNull();
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane"); // no boom
}

超时设置为 20000,MultipleActiveResultSets设置为 true

目前,我发现的唯一解决方法是在尝试.Single()之前在整个 DbSet 上调用 .ToList()

using (MyDbContext db = new MyDbContext ())
{
  Employee emp = db.Employees.Single(e => e.FirstName == "Bob" && e.LastName == "Morane");
  Node node = db.Nodes.ToList().Single(n => n.ShortName == "stuff"); //Works
}

但这是不可接受的,因为操作很频繁,而且我希望 DbSet 非常大,所以这将花费很多时间。

ObjectContext 已被 EnsureConnection() 在连续查询中抛出(未使用导航属性和 using(

好吧,正如我们(在 Eregrith 的更多努力下(发现的那样,是 EF 在将其发送到测试初始值设定项之前对上下文进行操作,以便它意外运行; 通过实现基本的创建/种子/删除而不是初始值设定项,异常消失了。(在我看来,它仍然需要更详细地调查那里实际发生的事情=] (

测试初始值设定项的调用方式如下:

System.Data.Entity.Database.SetInitializer<MyDbContext>(new DatabaseTestInitializer());

数据库测试初始值设定项:

public class DatabaseTestInitializer : DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        SeederHelper.Seed(context);
    }
}

删除对 SetInitializer 的调用<>解决了这个问题。

在基类单元测试中:

[SetUp]
protected virtual void Initialize()
{
  ContainerBuilder builder = new ContainerBuilder();
  this.RegisterTypes(builder);
  this.Container = builder.Build();
  //Removed: System.Data.Entity.Database.SetInitializer<MyDbContext>(new DatabaseTestInitializer());
  this.Db = Container.Resolve<MyDbContext>();
  this.Db.Should().NotBeNull();
  //Below: code added
  this.Db.Database.Delete();
  this.Db.Database.Create();
  SeederHelper.Seed(this.Db);
}
我不

熟悉 Nunit,但不久前我确实遇到了类似的问题,有多个 mstests 干扰。

尝试通过 Pooling=false 关闭连接字符串中的连接池

但仅适用于单元测试项目