Entity framework 4 从DBSet.SqlQuery返回更新的结果
我想使用以下方法来标记Person表中的人员,以便对其进行处理。必须将这些人标记为“进程中”,以便其他线程不在同一行上操作 在SQL Management Studio中,查询按预期工作。当我在我的应用程序中调用该方法时,我会收到该人员的行,但状态为旧 Status是Person的许多导航属性之一,当此查询返回时,它是作为代理对象返回的唯一属性Entity framework 4 从DBSet.SqlQuery返回更新的结果,entity-framework-4,Entity Framework 4,我想使用以下方法来标记Person表中的人员,以便对其进行处理。必须将这些人标记为“进程中”,以便其他线程不在同一行上操作 在SQL Management Studio中,查询按预期工作。当我在我的应用程序中调用该方法时,我会收到该人员的行,但状态为旧 Status是Person的许多导航属性之一,当此查询返回时,它是作为代理对象返回的唯一属性 // This is how I'm calling it (obvious, I know) var result = PersonLogic.Get
// This is how I'm calling it (obvious, I know)
var result = PersonLogic.GetPeopleWaitingInLine(100);
// And Here is my method.
public IList<Person> GetPeopleWaitingInLine(int count)
{
const string query =
@"UPDATE top(@count) PERSON
SET PERSON_STATUS_ID = @inProcessStatusId
OUTPUT INSERTED.PERSON_ID,
INSERTED.STATUS_ID
FROM PERSON
WHERE PERSON_STATUS_ID = @queuedStatusId";
var queuedStatusId = StatusLogic.GetStatus("Queued").Id;
var inProcessStatusId = StatusLogic.GetStatus("In Process").Id;
return Context.People.SqlQuery(query,
new SqlParameter("count", count),
new SqlParameter("queuedStateId", queuedStateId),
new SqlParameter("inProcessStateId", inProcessStateId)
}
// update | if I refresh the result set then I get the correct results
// but I'm not sure about this solution since it will require 2 DB calls
Context.ObjectContext().Refresh(RefreshMode.StoreWins, results);
//我就是这么称呼它的(很明显,我知道)
var结果=PersonLogic.getPeopleWaitingLine(100);
//这是我的方法。
公共IList GetPeopleWaitingLine(整数计数)
{
常量字符串查询=
@“更新顶级(@count)人员
设置人员\u状态\u ID=@inProcessStatusId
输出插入。个人\u ID,
插入的.STATUS\u ID
从个人
其中PERSON_STATUS_ID=@queuedstatuid”;
var queuedStatusId=StatusLogic.GetStatus(“排队”).Id;
var inProcessStatusId=StatusLogic.GetStatus(“进程中”).Id;
返回Context.People.SqlQuery(查询,
新的SqlParameter(“count”,count),
新的SqlParameter(“queuedStateId”,queuedStateId),
新的SqlParameter(“inProcessStateId”,inProcessStateId)
}
//更新|如果刷新结果集,则得到正确的结果
//但是我不确定这个解决方案,因为它需要2个DB调用
Context.ObjectContext().Refresh(RefreshMode.StoreWins,results);
我知道这是一个老问题,但这可能对某人有所帮助
似乎您正在使用全局上下文来进行查询,EF旨在保留缓存信息,如果您始终需要新数据,则必须使用新上下文来检索它。如下所示:
using (var tmpContext = new Contex())
{
// your query here
}
这将创建上下文并回收它。这意味着没有存储缓存,下次它从数据库而不是缓存中获取新数据。我知道这是一个老问题,但这可能会帮助某些人 似乎您正在使用全局上下文来进行查询,EF旨在保留缓存信息,如果您始终需要新数据,则必须使用新上下文来检索它。如下所示:
using (var tmpContext = new Contex())
{
// your query here
}
这将创建上下文并回收它。这意味着没有存储缓存,下次它从数据库而不是缓存获取新数据时