2012-05-17 78 views
1

我想要使用以下方法在Person表中標記人員,以便可以處理它們。這些人必須被標記爲「進程中」,以便其他線程不在同一行上操作。從DBSet.SqlQuery返回更新結果

在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

我知道這是一個老問題,但這可能有助於某人。

看起來您正在使用全球上下文爲您的查詢,EF旨在保留緩存信息,如果你總是需要新鮮數據必須使用新鮮的上下文來檢索它。因爲這樣:

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

這創建上下文並回收它。這意味着沒有存儲緩存,並且下一次從數據庫獲取新數據而不是從緩存中獲取。