2009-03-23 5 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 (I는 요청에 따라 컨텍스트를 사용하고 있습니다) 세션의 객체 (sessionUser)가 컨텍스트의 "in"객체와 같은 경우 이제 if는 잘 작동합니다. 컨텍스트가 처음 만들어지면 데이터베이스에 충돌하여 사용자를 붙잡아 야합니다. 비교해 보면, 그들은 동일하지 않으며 sesionUser는 이제 컨텍스트에서 사용자임을 분명합니다. 다음에이 옵션을 선택하면 sessionUser와 userToCheck가 동일합니다.

var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID); 

항상 데이터베이스를 명중 :

문제는 여전히입니다. 이것은 좋은 해결책이 아닙니다.

시큰둥 더 많은 업데이트이 결국 답을 할 수있다. 이 규칙을 잊어 버렸습니다.

x는 ObjectQuery 유형의 속성입니다. ObjectQuery를 실행하면 이 항상 보조 저장소를 공격합니다. 그게 그들이하는 일입니다. 에서 데이터베이스 쿼리를 실행하지 않으려면 은 ObjectQuery를 사용하지 마십시오.

+0

어쩌면 요점을 얻지 못했습니다. 세션 데이터의 사용자는 데이터베이스에서로드 할 때까지 새로 만든 개체 컨텍스트에있을 수 없습니다. 사용자가 새로운 객체 컨텍스트에 있어야한다고 생각할 때 명확히 할 수 있습니까? –

+0

생성 된 컨텍스트는 요청 당이므로 컨텍스트와 세션의 컨텍스트가 동일 할 수 있습니다. 컨텍스트가 요청 시작시 만들어 질 때가 아닙니다. 어느 것이 그들이 동일하고, 그렇지 않다면 데이터베이스에서 그것을 얻을 수 있는지 확인하고 싶습니다. –

답변

2

알았습니다.

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

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

로서 설명된다 GetObjectByKey 방법 :

GetObjectByKey가 ObjectStateManager에서 지정된 EntityKey 을 가진 개체를 검색하려고. 개체가 현재 개체 컨텍스트에 으로로드되지 않은 경우 데이터 소스에서 개체를 반환하기 위해 실행 된 쿼리는 입니다.

몇 가지 테스트를 수행하고 그것이하는대로합니다. 처음으로 (컨텍스트가 요청에 따라 생성 된) 데이터베이스를 조회하고 해당 개체가 세션의 내용과 대조되는지 확인합니다. 두 개는 같지 않으므로 sessionUser를 새 객체로 설정합니다. 이제 컨텍스트와 세션에 sessionUser가 생깁니다. 다음 번에 GetObjectByKey 메서드는 컨텍스트 만 검사합니다 (Profiler에서 데이터베이스 상호 작용을 나타내지 않음). 예.

0

왜 사용자 ID를 확인하지 않습니까?

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

또는 이전 컨텍스트에서 사용자 개체를 분리하고 Context.Attach()를 사용하여 새 컨텍스트에 첨부 할 수 있습니다.

+2

ID가 작동하지 않습니다. 그것은 실제로 해당 사용자의 컨텍스트를 확인한다는 아이디어를 무시하고 데이터베이스에서 사용자를 잡아낼 것입니다. 두 번째 제안을 해봐야 겠어. –

관련 문제