엔티티 프레임 워크 : 컨텍스트에 객체가 있는지 확인하는 방법이 있습니까?
-
21-08-2019 - |
문제
상황 : 다른 객체가 새로운 컨텍스트에 있기 때문에 과거의 컨텍스트에서 세션의 객체를 다른 객체의 부모로 설정할 수 없습니다.
컨텍스트에서 검색 한 세션에 사용자가 있다고 가정 해 봅시다. 이제 페이지를 다시로드하고 해당 컨텍스트가 기각되었으며 새로운 컨텍스트가 이루어졌습니다.
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)
또는 기존 컨텍스트에서 사용자 객체를 분리하고 컨텍스트를 사용하여 새로운 컨텍스트에 첨부 할 수 있습니다.