从DBSet.SqlQuery返回更新的结果

时间:2012-05-17 20:42:30

标签: entity-framework-4

我想使用以下方法标记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);

1 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但这可以帮助某人。

您的查询似乎正在使用全局上下文,EF旨在保留缓存信息,如果您总是需要新数据,则必须使用新的上下文来检索它。这样:

using (var tmpContext = new Contex())
{
    // your query here
} 

这会创建上下文并回收它。这意味着没有存储缓存,下次它从数据库获取新数据而不是缓存。