新しいコンテキストを使用してエンティティ オブジェクトを変更するのに苦労しています。私はこれまで何度もこの作業を行ってきましたが、このインスタンスでは、古い「ObjectContext インスタンスが破棄されました」という例外が発生しています。
これが私のクイック編集/保存コードです:
private void SaveChanges()
{
using (var context = new Manticore.ManticoreContext(Global.ManticoreClient))
{
**context.AttachTo("Users", Global.LoggedInUser);**
Global.LoggedInUser.FirstName = this.FirstNameText.Text;
Global.LoggedInUser.LastName = this.LastNameText.Text;
Global.LoggedInUser.Email = this.EmailText.Text;
context.SaveChanges();
}
}
Global.LoggedInUser プロパティ (インスタンス化されます):
public static Manticore.User LoggedInUser
{
get
{
return HttpContext.Current.Session["LoggedInUser"] as Manticore.User;
}
set
{
HttpContext.Current.Session["LoggedInUser"] = value;
}
}
そして、キッカーはここに動作する簡単な単体テストです(現在アサートはありませんが、例外はスローされていません):
private User _testUser;
private TestInstanceBucket _testBucket;
[TestInitialize]
public void TestInitialize()
{
using (var context = new Manticore.ManticoreContext())
{
this._testBucket = new TestInstanceBucket(context);
this._testUser = this._testBucket.TestUser;
context.AddObject("Users", this._testUser);
context.SaveChanges();
}
}
[TestMethod]
public void User_ShouldBeAbleToChangeDetails()
{
using (var context = new ManticoreContext())
{
context.AttachTo("Users", this._testUser);
this._testUser.FirstName = "New";
context.SaveChanges();
}
}
私が言うように、私は以前にこのようなコードを実行したことがありますが、うまくいきました。私は運が良かったのでしょうか、それともエンティティをセッションに保存すると問題が発生する可能性がありますか?
アップデート
コードをグローバルから、SaveChanges() を使用するページが継承するページベース クラスに移動しました。同じ問題であるため、静的クラス/メソッドをルール化し、エンティティをセッションに保存すると、何らかの問題が発生します。
アップデート
それで、数時間壁に頭をぶつけた後、面倒だとしてもかなり簡単な修正ができました。ユーザーの最初のフェッチの後、私は今呼び出します
context.Detach(user);
テスト環境と比較して、ASP.NETのガベージコレクションでコンテキストが破棄される速度に関係しているとしか思えません。