Entity framework 4 从DBSet.SqlQuery返回更新的结果

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

我想使用以下方法来标记Person表中的人员,以便对其进行处理。必须将这些人标记为“进程中”,以便其他线程不在同一行上操作

在SQL Management Studio中,查询按预期工作。当我在我的应用程序中调用该方法时,我会收到该人员的行,但状态为旧

Status是Person的许多导航属性之一,当此查询返回时,它是作为代理对象返回的唯一属性

// 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
} 
这将创建上下文并回收它。这意味着没有存储缓存,下次它从数据库而不是缓存获取新数据时