实体框架:有没有一种方法来检查,如果上下文有一个对象?
-
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)是相同的“中”的上下文中的一个。现在,如果作品就好了。第一次的背景下创作的,这应该打数据库并获取用户。一旦相比,很明显,他们是不一样的和sesionUser现在在上下文中的用户。下一次,如果被选中,则sessionUser和userToCheck是相同的。
问题仍然是:
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
总是命中数据库。这不是一个很好的解决方案。
更多更新强>
咩这可能是毕竟答案。我已经忘记了这条规则:
x是类型的ObjectQuery的属性。 当您执行的ObjectQuery,它 总是会撞到后备存储。 这是他们做什么。如果你不想 执行数据库查询,然后 不使用的ObjectQuery。
解决方案
确定了它。
ChatUser userCheck = (ChatUser)EntityContext.Context.GetObjectByKey(returnValue.EntityKey);
if(userCheck != returnValue)
{
sessionUser = userCheck;
}
其被描述为的GetObjectByKey方法:
GetObjectByKey试图检索一个 已指定的对象 的EntityKey从ObjectStateManager。 如果当前未加载的对象 到对象上下文中,查询是 在试图返回执行 从数据源对象。
做了一些测试和它做什么,它说。第一次通过(背景要求创建),它击中的数据库和对象对什么是在会话检查。两者是不一样的,所以它会将sessionUser给新的对象,因此如今在上下文中和会议的sessionUser。围绕GetObjectByKey方法下一次只检查上下文(如探查表明没有数据库交互)。耶。
其他提示
为什么不检查用户ID?
context.Users.Any(user => user.Id = ((User)session["SomeUser"]).Id)
或者你可能只是从旧的上下文脱离用户对象和使用Context.Attach()将其附加到新的环境。