我在调用数据库上下文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