状況:過去のコンテキストからのセッション中のオブジェクトは、他のオブジェクトが新しいコンテキストにあるので、別のオブジェクトの親として設定することはできません。Entity Framework:コンテキストにオブジェクトがあるかどうかを確認する方法はありますか?
私がコンテキストから取得したセッション中のユーザーがいるとします。ここでページがリロードされ、そのコンテキストが終了し、新しいコンテキストが作成されます。
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;
}
アイデアを確認することです。
UPDATE
を(私がリクエストごとにコンテキストを使用しています)だから、私はこの問題を解決する方法の良いアイデアを得ることができるまで、一時的にこれをしませんでしたセッション内のオブジェクト(sessionUser)がコンテキスト内のオブジェクトと同じ場合今、ifはうまく動作します。最初にコンテキストが作成されたときに、データベースにヒットしてユーザーを取得する必要があります。一度比較されると、彼らは同じではないことが明らかです。そして、sesionUserは今やコンテキストのユーザです。次回にチェックされている場合、sessionUserとuserToCheckは同じです。
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
常にデータベースを打つ:
問題はまだあります。これは良い解決策ではありません。
MEH詳しいアップデート、これはすべての後の答えであってもよいです。私はこのルールを忘れていた:
xはObjectQuery型のプロパティです。 ObjectQueryを実行すると、 は常にバッキングストアにヒットします。 それは彼らがしていることです。 にデータベースクエリを実行させたくない場合は、 はObjectQueryを使用しません。
多分私はポイントを取得していない。セッションデータのユーザーは、データベースからロードするまで、新しく作成されたオブジェクトコンテキストには存在しません。ユーザーが新しいオブジェクトのコンテキストにいることを期待したときにクリアすることができますか? –
作成されたコンテキストは要求ごとに作成されるため、セッション内とコンテキスト内のコンテキストは同じである可能性があります。要求の開始時にコンテキストが作成されたときではない。どちらが同じかどうかをチェックしたいのですが、そうでない場合はデータベースから取得します。 –