簡體   English   中英

使用存根實體更新實體關系時捕獲了optimisticconcurrencyexception

[英]optimisticconcurrencyexception was caught when updating entity relation using stub entities

這段代碼給了我optimisticconcurrencyexception被捕獲。 我只是在使用存根實體來獲取現有記錄並嘗試更新幾個值。 我不確定如何解決該異常。 很感謝任何形式的幫助:

using (MiscEntities ctx = new MiscEntities())  
{  
    var m = ctx.Rates.FirstOrDefault(m => m.UserId == UserIdGuid);      
    DataAccess.Rate oldDbRate = new DataAccess.Rate { RatingId = m.RatingId };    
    ctx.AttachTo("Rates", dbRate);  
    dbRate.Rating = Rating;  
    dbRate.DateLastModified = DateTime.Now;                      
    ctx.SaveChanges();  
}  

默認情況下,EF使用開放式並發模型,這意味着在查詢數據和更新數據之間,不會對源中的數據持有鎖定。 因此,在將更改保存到數據庫之前,它不會檢查任何沖突。 發生任何沖突時,都會引發OptimisticConcurrencyException(有關更多信息,請參見如何:在對象上下文中管理數據並發 )。

良好的做法(當您在高並發情況下進行更新時)經常調用Refresh 在這種情況下,請嘗試使用ClientWins的RefreshMode刷新客戶端存儲中的值,然后再將其發送到數據庫,如下所示:

using (MiscEntities ctx = new MiscEntities())
{
    try
    {
        var m = ctx.Rates.FirstOrDefault(m => m.UserId == UserIdGuid);
        DataAccess.Rate oldDbRate = new DataAccess.Rate { RatingId = m.RatingId };
        ctx.AttachTo("Rates", dbRate);
        dbRate.Rating = Rating;
        dbRate.DateLastModified = DateTime.Now;
        ctx.SaveChanges();
    }
    catch (OptimisticConcurrencyException)
    {
        ctx.Refresh(RefreshMode.ClientWins, dbRate);
        ctx.SaveChanges();
    }                
}

編輯:更多閱讀后,重新讀取該錯誤消息是有道理的,因此無法將對象附加到ObjectContext,因為該對象已經由ObjectStateManager緩存。

該解決方案非常簡單,請在ObjectContext中執行任何操作/查詢之前附加對象。 這使您可以防止任何雙重跟蹤請求。 如果ObjectContext以后需要您的Entity,它將檢索您之前附加的實例,您可以繼續進行。 看一下這段代碼,看看是否有幫助(對不起,暫時沒有打開Visual Studio 2010)

using (MiscEntities ctx = new MiscEntities())
{
    try
    {
        ctx.AttachTo("Rates", dbRates);

        var m = ctx.Rates.FirstOrDefault(m => m.UserId == UserIdGuid);
        DataAccess.Rate oldDbRate = new DataAccess.Rate { RatingId = m.RatingId };

        dbRate.Rating = Rating;
        dbRate.DateLastModified = DateTime.Now;
        ctx.SaveChanges();
    }
    catch (OptimisticConcurrencyException)
    {
        ctx.Refresh(RefreshMode.ClientWins, dbRate);
        ctx.SaveChanges();

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM