状況: 過去のコンテキストからのセッション内のオブジェクトは、他のオブジェクトが新しいコンテキスト内にあるため、別のオブジェクトの親として設定できません。
コンテキストから取得した User in session があるとします。ページがリロードされ、そのコンテキストが破棄され、新しいコンテキストが作成されます。
someUser = context.First(user => user.id == id);
Session["SomeUser"] = someUser
...
context.Dispose();
ページのリロード
userAddress = new UserAddress();
userAddress.User = (User)Session["SomeUser"]; //BOOM NOT IN SAME CONTEXT
私がやりたいことは次のとおりです。
if(!context.SomeUsers.Contains((User)Session["SomeUSer"]) //Only check context NOT DATABASE
{
//Reload from database
//Set user in session to new object
}
セッション内のオブジェクトが現在のコンテキストに属していない場合、データベースから再ロードして、現在のコンテキスト内の他のすべてのオブジェクトと同じコンテキストによって「所有」されるようにするという考え方です。(リクエストごとにコンテキストを使用しています)
アップデート
したがって、これを修正する方法をよりよく理解できるようになるまで、一時的にこれを行いました。
Int32 sessionUser = sessionUser .UserID;
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
if (userCheck != sessionUser)
{
sessionUser = userCheck;
}
アイデアは、セッション内のオブジェクト (sessionUser) がコンテキスト内のオブジェクトと同じかどうかを確認することです。これで、if は問題なく動作します。コンテキストが初めて作成されたときに、データベースにアクセスしてユーザーを取得する必要があります。比較すると、それらが同じではないことは明らかであり、sessionUser は現在、コンテキスト内のユーザーです。次に if がチェックされると、sessionUser と userToCheck は同じになります。
問題はまだあります:
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
常にデータベースにヒットします。これは良い解決策ではありません。
もっとアップデート
結局、これが答えかもしれません。私はこのルールを忘れていました:
x は ObjectQuery 型のプロパティです。ObjectQuery を実行すると、常にバッキング ストアにヒットします。それが彼らの仕事です。データベース クエリを実行したくない場合は、ObjectQuery を使用しないでください。