2016-01-13 37 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