Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架:有没有办法检查上下文是否有对象?_.net_Entity Framework_Objectcontext - Fatal编程技术网

.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不起作用。它实际上会从数据库中抓取用户,而不是为该用户检查上下文。你的第二个建议,我得试试。也许我没明白重点。会话数据中的用户将永远不会处于新创建的对象上下文中,除非您从数据库中加载它。当您检查用户是否在新对象上下文中时,是否可以进行清除?好的,上下文是根据每个请求创建的,因此会话中的上下文和上下文中的上下文可能是相同的。而不是在请求开始时创建上下文。这就是我想要检查它们是否相同的地方,如果不相同,那么从数据库中获取它。