2016-09-15 134 views
-2

异常类型的这个错误:如何解决System.Data.Entity.Core.OptimisticConcurrencyException

System.DataEntity.Core.OptimisticConcurrencyException

消息:

商店更新,插入或删除语句影响了意外的行数(0) 。自从装载了实体 以来,实体可能已被修改或删除。刷新ObjectStateManager条目。

堆栈跟踪:

System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.ValidateRow> sAffected(Int64类型, System.Data.Entity.Core.Mapping.Update。 Internal.UpdateCommand)
System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [[System.Int32, mscorlib]]() System.Func1, System.Data.Entity.Infrastructure.IDbExecutionStrategy,布尔型, B oolean)
System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(System.Data.Entity.Core.Objects.SaveOptions, System.Data.Entity.Infrastructure.IDbExecutionStrategy,布尔值)
System.Data.Entity的.SqlServer.DefaultSqlExecutionStrategy.Execute [System.Int32, mscorlib程序]
System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(System.Data.Entity.Core.Objects.SaveOptions, 布尔) System.Data。 Entity.Internal.InternalContext.SaveChanges()

代码1)EfRepository:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.Validation; 
using System.Linq; 
using Nop.Core; 
using Nop.Core.Data; 
namespace Nop.Data 
{ 
    /// <summary> 
    /// Entity Framework repository 
    /// </summary> 
    public partial class EfRepository<T> : IRepository<T> where T : BaseEntity 
    { 
     #region Fields 
     private readonly IDbContext _context; 
     private IDbSet<T> _entities; 
     #endregion 
     #region Ctor 
     /// <summary> 
     /// Ctor 
     /// </summary> 
     /// <param name="context">Object context</param> 
     public EfRepository(IDbContext context) 
     { 
      this._context = context; 
     } 

     #endregion 
     #region Methods 
     /// <summary> 
     /// Get entity by identifier 
     /// </summary> 
     /// <param name="id">Identifier</param> 
     /// <returns>Entity</returns> 
     public virtual T GetById(object id) 
     { 
      //see some suggested performance optimization (not tested) 
      //http://stackoverflow.com/questions/11686225/dbset-find-method-ridiculously-slow-compared-to-singleordefault-on-id/11688189#comment34876113_11688189 
      return this.Entities.Find(id); 
     } 
     /// <summary> 
     /// Insert entity 
     /// </summary> 
     /// <param name="entity">Entity</param> 
     public virtual void Insert(T entity) 
     { 
      try 
      { 
       if (entity == null) 
        throw new ArgumentNullException("entity"); 

       this.Entities.Add(entity); 

       this._context.SaveChanges(); 
      } 
      catch (DbEntityValidationException dbEx) 
      { 
       var msg = string.Empty; 

       foreach (var validationErrors in dbEx.EntityValidationErrors) 
        foreach (var validationError in validationErrors.ValidationErrors) 
         msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; 
var fail = new Exception(msg, dbEx); 
       //Debug.WriteLine(fail.Message, fail); 
       throw fail; 
      } 
     } 

     /// <summary> 
     /// Insert entities 
     /// </summary> 
     /// <param name="entities">Entities</param> 
     public virtual void Insert(IEnumerable<T> entities) 
     { 
      try 
      { 
       if (entities == null) 
        throw new ArgumentNullException("entities"); 

       foreach (var entity in entities) 
        this.Entities.Add(entity); 

       this._context.SaveChanges(); 
      } 
      catch (DbEntityValidationException dbEx) 
      { 
       var msg = string.Empty; 

       foreach (var validationErrors in dbEx.EntityValidationErrors) 
        foreach (var validationError in validationErrors.ValidationErrors) 
         msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; 

       var fail = new Exception(msg, dbEx); 
       //Debug.WriteLine(fail.Message, fail); 
       throw fail; 
      } 
     } 

     /// <summary> 
     /// Update entity 
     /// </summary> 
     /// <param name="entity">Entity</param> 
     public virtual void Update(T entity) 
     { 
      try 
      { 
       if (entity == null) 
        throw new ArgumentNullException("entity"); 

       this._context.SaveChanges(); 
      } 
      catch (DbEntityValidationException dbEx) 
      { 
       var msg = string.Empty; 

       foreach (var validationErrors in dbEx.EntityValidationErrors) 
        foreach (var validationError in validationErrors.ValidationErrors) 
         msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 

       var fail = new Exception(msg, dbEx); 
       //Debug.WriteLine(fail.Message, fail); 
       throw fail; 
      } 
     } 

     /// <summary> 
     /// Delete entity 
     /// </summary> 
     /// <param name="entity">Entity</param> 
     public virtual void Delete(T entity) 
     { 
      try 
      { 
       if (entity == null) 
        throw new ArgumentNullException("entity"); 

       this.Entities.Remove(entity); 

       this._context.SaveChanges(); 
      } 
      catch (DbEntityValidationException dbEx) 
      { 
       var msg = string.Empty; 

       foreach (var validationErrors in dbEx.EntityValidationErrors) 
        foreach (var validationError in validationErrors.ValidationErrors) 
         msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 

       var fail = new Exception(msg, dbEx); 
       //Debug.WriteLine(fail.Message, fail); 
       throw fail; 
      } 
     } 

     /// <summary> 
     /// Delete entities 
     /// </summary> 
     /// <param name="entities">Entities</param> 
     public virtual void Delete(IEnumerable<T> entities) 
     { 
      try 
      { 
       if (entities == null) 
        throw new ArgumentNullException("entities"); 

       foreach (var entity in entities) 
        this.Entities.Remove(entity); 

       this._context.SaveChanges(); 
      } 
      catch (DbEntityValidationException dbEx) 
      { 
       var msg = string.Empty; 

       foreach (var validationErrors in dbEx.EntityValidationErrors) 
        foreach (var validationError in validationErrors.ValidationErrors) 
         msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 

       var fail = new Exception(msg, dbEx); 
       //Debug.WriteLine(fail.Message, fail); 
       throw fail; 
      } 
     } 

     #endregion 

     #region Properties 

     /// <summary> 
     /// Gets a table 
     /// </summary> 
     public virtual IQueryable<T> Table 
     { 
      get 
      { 
       return this.Entities; 
      } 
     } 

     /// <summary> 
     /// Gets a table with "no tracking" enabled (EF feature) Use it only when you load record(s) only for read-only operations 
     /// </summary> 
     public virtual IQueryable<T> TableNoTracking 
     { 
      get 
      { 
       return this.Entities.AsNoTracking(); 
      } 
     } 

     /// <summary> 
     /// Entities 
     /// </summary> 
     protected virtual IDbSet<T> Entities 
     { 
      get 
      { 
       if (_entities == null) 
        _entities = _context.Set<T>(); 
       return _entities; 
      } 
     } 

     #endregion 
    } 
} 

IDbContext

using System.Collections.Generic; 
using System.Data.Entity; 
using Nop.Core; 

namespace Nop.Data 
{ 
    public interface IDbContext 
    { 
     /// <summary> 
     /// Get DbSet 
     /// </summary> 
     /// <typeparam name="TEntity">Entity type</typeparam> 
     /// <returns>DbSet</returns> 
     IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity; 

     /// <summary> 
     /// Save changes 
     /// </summary> 
     /// <returns></returns> 
     int SaveChanges(); 

     /// <summary> 
     /// Execute stores procedure and load a list of entities at the end 
     /// </summary> 
     /// <typeparam name="TEntity">Entity type</typeparam> 
     /// <param name="commandText">Command text</param> 
     /// <param name="parameters">Parameters</param> 
     /// <returns>Entities</returns> 
     IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) 
      where TEntity : BaseEntity, new(); 

     /// <summary> 
     /// Creates a raw SQL query that will return elements of the given generic type. The type can be any type that has properties that match the names of the columns returned from the query, or can be a simple primitive type. The type does not have to be an entity type. The results of this query are never tracked by the context even if the type of object returned is an entity type. 
     /// </summary> 
     /// <typeparam name="TElement">The type of object returned by the query.</typeparam> 
     /// <param name="sql">The SQL query string.</param> 
     /// <param name="parameters">The parameters to apply to the SQL query string.</param> 
     /// <returns>Result</returns> 
     IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters); 

     /// <summary> 
     /// Executes the given DDL/DML command against the database. 
     /// </summary> 
     /// <param name="sql">The command string</param> 
     /// <param name="doNotEnsureTransaction">false - the transaction creation is not ensured; true - the transaction creation is ensured.</param> 
     /// <param name="timeout">Timeout value, in seconds. A null value indicates that the default value of the underlying provider will be used</param> 
     /// <param name="parameters">The parameters to apply to the command string.</param> 
     /// <returns>The result returned by the database after executing the command.</returns> 
     int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = null, params object[] parameters); 
    } 
} 
+1

哪一行代码会引发错误?不要只是在这里转储所有的代码(GetById()或者接口声明等方法与你的问题有什么关系?)。 [如何创建一个最小,完整和可验证的示例](http://stackoverflow.com/help/mcve) –

回答

0

这表明你正在尝试更新已删除/修改背景/其他用户会话的实体。 我想你们已经在你的表中添加了rowversions并且启用了并发控制。 异常是告诉你发生了一个并发修改。 您可以通过重新加载实体并重试操作来处理此问题。

-1
public virtual void Insert(T entity) 
     { 
      try 
      { 
       if (entity == null) 
        throw new ArgumentNullException("entity"); 
       this.Entities.Add(entity); 
       this._context.SaveChanges(); 
      } 
      catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex) 
      { 
       //Safely ignore this exception 
      } 
      catch (System.Data.Entity.Core.OptimisticConcurrencyException) 
      { 
      //Safely ignore this exception 
      }     
      catch (DbEntityValidationException dbEx) 
      { 

      var msg = string.Empty; 
      foreach (var validationErrors in dbEx.EntityValidationErrors) 
       foreach (var validationError in validationErrors.ValidationErrors) 
        msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; 
      var fail = new Exception(msg, dbEx); 
      //Debug.WriteLine(fail.Message, fail); 
      throw fail; 
     } 
    }