NopCommerce中的更新操作问题?

时间:2014-03-06 11:20:21

标签: asp.net-mvc nopcommerce

我正在使用NopCommerce。我创建了名为“ProductViewDetails”的新表。我试图在此表中插入/更新记录。当我尝试在表中插入新记录时,新记录已成功插入。但是当我尝试更新操作时,方法“UpdateData”成功执行但记录没有更新。

代码:

    public void IncremementViews(int productId)
    {
    ProductViewDetails ProductDetails = new ProductViewDetails();
    ProductDetails.Id = 5;
    ProductDetails.ProductId = 1;
    ProductDetails.NumberOfViews = 10; 

    UpdateData(ProductDetails);
    }  

    public void UpdateData(ProductViewDetails productDetails)
    {         
       _productViewDetails.Update(productDetails);

    }  

更新方法代码:

   public partial class EfRepository<T> : IRepository<T> where T : BaseEntity
   {
    private readonly IDbContext _context;
    private IDbSet<T> _entities;

    public 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;
        }
    }
   }

有什么问题?

2 个答案:

答案 0 :(得分:3)

NopCommerce使用具有延迟加载和代理实体的实体框架来跟踪更改,当您实例化新实体时(如在新的ProductViewDetails()中),实体框架上下文对该实体一无所知,并且上下文无法跟踪任何更改

  • 如果实体之前存在,则从存储库中获取它 GetById方法而不是实例化它,上下文将返回 以及附加和代理的实体,因此上下文将解决每一个变化 你这样做,当你打电话给更新时,所有的更改都将保存。
  • 如果您的实体是新实体,则应调用该方法的添加方法 库中。

答案 1 :(得分:0)

试试这个

ProductViewDetails ProductDetails = new ProductViewDetails();

/ 在服务中创建此函数并调用此函数并检索所需的ProductDetails记录 /

ProductDetails =_MostViewedProductService.GetMostViewedProductById(productId);
                        UpdateData(ProductDetails);