엔티티 프레임 워크 : 컨텍스트에 객체가 있는지 확인하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/675625

문제

상황 : 다른 객체가 새로운 컨텍스트에 있기 때문에 과거의 컨텍스트에서 세션의 객체를 다른 객체의 부모로 설정할 수 없습니다.

컨텍스트에서 검색 한 세션에 사용자가 있다고 가정 해 봅시다. 이제 페이지를 다시로드하고 해당 컨텍스트가 기각되었으며 새로운 컨텍스트가 이루어졌습니다.

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는 잘 작동합니다. 처음으로 컨텍스트가 생성되면 데이터베이스에 도달하고 사용자를 잡아야합니다. 일단 비교되면, 그들이 동일하지 않다는 것은 분명하고 Sesionuser는 이제 상황에서 사용자입니다. 다음에 확인하면 SessionUser와 Usertocheck이 동일합니다.

문제는 여전히 다음과 같습니다.

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

항상 데이터베이스를칩니다. 이것은 좋은 해결책이 아닙니다.

더 많은 업데이트

Meh 이것은 결국 답이 될 수 있습니다. 나는이 규칙을 잊었다 :

X는 Type ObjectQuery의 속성입니다. ObjectQuery를 실행하면 항상 후원 상점에 닿습니다. 그것이 그들이하는 일입니다. 데이터베이스 쿼리를 실행하지 않으려면 ObjectQuery를 사용하지 마십시오.

도움이 되었습니까?

해결책

알았어.

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

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

다음과 같이 설명되는 getObjectBykey 메소드

GetObjectBykey는 ObjectStateManager에서 지정된 EntityKey가있는 개체를 검색하려고합니다. 객체가 현재 객체 컨텍스트에로드되지 않으면 데이터 소스에서 객체를 반환하기 위해 쿼리가 실행됩니다.

약간의 테스트를했고 그 말을합니다. 처음으로 (컨텍스트가 요청시 생성 됨) 데이터베이스에 부딪 히고 해당 객체를 세션의 내용에 대해 확인합니다. 두 사람은 동일하지 않으므로 세션 사용자를 새 개체로 설정하므로 이제 컨텍스트와 세션에 세션 사용자가 있습니다. 다음에 getObjectBykey 메소드 주변에서는 컨텍스트 만 확인합니다 (프로파일 러는 데이터베이스 상호 작용을 보여주지 않았기 때문에). 예.

다른 팁

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

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

또는 기존 컨텍스트에서 사용자 객체를 분리하고 컨텍스트를 사용하여 새로운 컨텍스트에 첨부 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top