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