2009-03-23 20 views
2

状況:過去のコンテキストからのセッション中のオブジェクトは、他のオブジェクトが新しいコンテキストにあるので、別のオブジェクトの親として設定することはできません。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を使用しません。

+0

多分私はポイントを取得していない。セッションデータのユーザーは、データベースからロードするまで、新しく作成されたオブジェクトコンテキストには存在しません。ユーザーが新しいオブジェクトのコンテキストにいることを期待したときにクリアすることができますか? –

+0

作成されたコンテキストは要求ごとに作成されるため、セッション内とコンテキスト内のコンテキストは同じである可能性があります。要求の開始時にコンテキストが作成されたときではない。どちらが同じかどうかをチェックしたいのですが、そうでない場合はデータベースから取得します。 –

答えて

2

それを得ました。

ChatUser userCheck = (ChatUser)EntityContext.Context.GetObjectByKey(returnValue.EntityKey); 

if(userCheck != returnValue) 
{ 
    sessionUser = userCheck; 
} 

として記載されてGetObjectByKey方法:

GetObjectByKeyはObjectStateManagerから指定 のEntityKeyを有する オブジェクトを取得しようとします。 オブジェクトが現在オブジェクト・コンテキストにロードされていない場合は、 が実行され、データ・ソースから オブジェクトが戻されます。

いくつかのテストを行いましたが、それは何をしていますか?初めて(コンテキストが要求に応じて作成される)、データベースにヒットし、そのオブジェクトがセッション中のものかどうかをチェックします。 2つは同じではないので、sessionUserを新しいオブジェクトに設定します。したがって、sessionUserはコンテキストとセッションにあります。次回は、GetObjectByKeyメソッドの前後で(As Profilerがデータベースとのやり取りを示さなかった)コンテキストのみをチェックします。わーい。

0

なぜユーザーIDを確認するだけではないのですか?

context.Users.Any(user => user.Id = ((User)session["SomeUser"]).Id) 

それとも、ただ古いコンテキストからユーザーオブジェクトを切り離し、Context.Attachを()を使用して、新しいコンテキストにアタッチすることがあります。

+2

IDが機能しません。実際には、そのユーザーのコンテキストをチェックするというアイデアを打ち破って、データベースからユーザーを掴みます。あなたはもう一度お試しください。 –

関連する問題