2016-01-13 38 views
0

我在調用數據庫上下文SaveChanges方法時出現以下錯誤。該錯誤表明這是由於併發問題。如何:EF 6插入實體與身份證字段

錯誤消息: 商店更新,插入或刪除語句影響的行(0)的一個意想不到的數量。自實體加載後,實體可能已被修改或刪除。刷新ObjectStateManager條目。

描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:System.Data.Entity.Core.OptimisticConcurrencyException:存儲更新,插入或刪除語句會影響意外數量的行(0)。自實體加載後,實體可能已被修改或刪除。刷新ObjectStateManager條目。

我發現了幾個有關此錯誤的線程,但沒有解決方案在我的情況下工作。

我相信真正的問題與默認實體ID字段(ResourceAccessLogID)設置爲0有關。 ResourceAccessLogID字段是由數據庫服務器初始化的標識字段。我不確定我錯過了什麼,或者做錯了什麼。

注意:我還嘗試在添加/插入新實體之前創建一個「新鮮」上下文,並且SaveChanges認爲引擎蓋下的某些東西可能導致EF認爲存在一個併發問題。但是,這也沒有幫助。

謝謝提前爲任何人誰可以解決這個問題。

public class ResourceAccessLog 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long ResourceAccessLogID { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public DateTime DateTime { get; set; } 

    [Required] 
    public long ResourceID { get; set; } 

    [Required] 
    [StringLength(128)] 
    public string UserID { get; set; } 

    public virtual Resource Resource { get; set; } 

    public virtual ApplicationUser User { get; set; } 
} 

private void SaveResourceAccessLog(string userID, long resourceID) 
{ 

    ResourceAccessLog resourceAccessLog = new ResourceAccessLog(); 
    // resourceAccessLog.ResourceAccessLogID = 0; Default 
    resourceAccessLog.DateTime = DateTime.Now; 
    resourceAccessLog.ResourceID = resourceID; 
    resourceAccessLog.UserID = userID; 

    DbContext.ResourceAccessLogs.Add(resourceAccessLog);     
    DbContext.SaveChanges(); 
} 
+0

注意:爲消除可疑的併發問題,我從實體標識字段中刪除了標識屬性,以前一次遷移爲目標,添加了新遷移並更新了數據庫。然後我硬編碼ID = 1,並插入新的實體沒有錯誤。所以我相信,這實際上與EF如何用默認的long值= 0插入我的實體有關。 – Sean

回答

1

看來你的邏輯有一些問題,你使用的是mutithreaded環境,你的DbContext是在它們之間共享的嗎? 如果您確定並打算傳遞稱爲樂觀併發的此功能,則可以嘗試刷新對象上下文。

 try 
     { 
      DbContext.SaveChanges(); 
     } 
     catch (System.Data.Entity.Core.OptimisticConcurrencyException) 
     { 
      ((System.Data.Entity.Infrastructure.IObjectContextAdapter)DbContext) 
       .ObjectContext.Refresh(System.Data.Entity.Core.Objects.RefreshMode.ClientWins, resourceAccessLog); 
     } 
+0

感謝您的回覆,但是我提出了與建議的解決方案相同的錯誤。 DBContext位於ASP.NET WebForms應用程序的上下文中。爲了證明這不是併發問題,我從實體標識字段中刪除了標識屬性,並更新了數據庫模式。然後,我對ID = 1進行硬編碼。我插入記錄沒有任何問題。 – Sean