调用db context SaveChanges方法时出现以下错误。该错误表明它是由并发问题引起的。
错误消息: 存储更新,插入或删除语句会影响意外的行数(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 :(得分: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);
}