如何:EF 6插入具有标识ID的实体字段

时间:2016-01-13 19:05:59

标签: entity-framework insert entity-framework-6 entity add

调用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();
}

1 个答案:

答案 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);
        }