.net 实体框架:有没有办法检查上下文是否有对象?
情况:来自过去上下文的会话中的对象不能设置为另一个对象的父对象,因为另一个对象位于新上下文中 假设会话中有一个从上下文检索到的用户。现在重新加载页面,该上下文已被取消,并创建了一个新上下文.net 实体框架:有没有办法检查上下文是否有对象?,.net,entity-framework,objectcontext,.net,Entity Framework,Objectcontext,情况:来自过去上下文的会话中的对象不能设置为另一个对象的父对象,因为另一个对象位于新上下文中 假设会话中有一个从上下文检索到的用户。现在重新加载页面,该上下文已被取消,并创建了一个新上下文 someUser = context.First(user => user.id == id); Session["SomeUser"] = someUser ... context.Dispose(); 页面重新加载 userAddress = new UserAddress(); userAddr
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现在是上下文中的用户。下次选中if时,sessionUser和userToCheck是相同的
问题仍然是:
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
总是点击数据库。这不是一个好的解决方案
更多更新
嗯,也许这就是答案。我忘记了这条规则:
x是ObjectQuery类型的属性。
当您执行ObjectQuery时,它
他总是会去后备商店。
他们就是这么做的。如果你不想
执行数据库查询,然后
不要使用ObjectQuery
为什么不检查一下用户id呢
context.Users.Any(user => user.Id = ((User)session["SomeUser"]).Id)
或者,您可以将用户对象从旧上下文中分离出来,然后使用context.attach()将其附加到新上下文。好,明白了
ChatUser userCheck = (ChatUser)EntityContext.Context.GetObjectByKey(returnValue.EntityKey);
if(userCheck != returnValue)
{
sessionUser = userCheck;
}
GetObjectByKey方法,描述如下:
GetObjectByKey尝试检索
对象,该对象具有指定的
ObjectStateManager中的EntityKey。
如果对象当前未加载
在对象上下文中,查询是
在试图返回
对象从数据源中删除
做了一些测试,它做到了它说的。第一次通过(上下文是根据请求创建的)命中数据库并根据会话中的内容检查该对象。这两个对象不同,因此它将sessionUser设置为新对象,因此现在在上下文和会话中都有sessionUser。下次,GetObjectByKey方法只检查上下文(因为探查器显示没有数据库交互)。是的。ID不起作用。它实际上会从数据库中抓取用户,而不是为该用户检查上下文。你的第二个建议,我得试试。也许我没明白重点。会话数据中的用户将永远不会处于新创建的对象上下文中,除非您从数据库中加载它。当您检查用户是否在新对象上下文中时,是否可以进行清除?好的,上下文是根据每个请求创建的,因此会话中的上下文和上下文中的上下文可能是相同的。而不是在请求开始时创建上下文。这就是我想要检查它们是否相同的地方,如果不相同,那么从数据库中获取它。