どういうわけか、EF はそれ以上の通知なしに 2 つのクエリの間に 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()
。
2 つのリクエストを逆にしてもうまくいきません。
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 プロジェクトでのみ発生するということです。(データベース名を除いて)2つに同じconnectionStringを設定しましたが、それも何もしませんでした。
さらに悪いことに:
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 が非常に大きくなると予想されるため、これは容認できません。