5

どういうわけか、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 が非常に大きくなると予想されるため、これは容認できません。

4

2 に答える 2

0

私はNunitに精通していませんが、しばらく前に複数のmstestsが干渉するという同様の問題がありました。

Pooling=falseを使用して、接続文字列内の接続プーリングをオフにしてみてください。

ただし、単体テスト プロジェクトのみ

于 2013-10-23T02:13:26.467 に答える