不知何故,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
尚未通过 using 处理,因此这是不可能的。错误也发生在.First()
and.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"
}
我也不使用 Employee 的任何导航属性,这并不能解决问题:
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
}
我注意到的是这个问题不会出现在 WebSite 项目中,而只会出现在 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
.
目前我发现的唯一解决方法是.ToList()
在尝试之前调用整个 DbSet .Single()
:
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 很大,所以这将花费大量时间。