【问题标题】:Apress Pro Asp.net MVC Framework 3 - SportsStore Edit Product not working?Apress Pro Asp.net MVC Framework 3 - SportsStore 编辑产品不起作用?
【发布时间】:2011-06-15 08:18:28
【问题描述】:

大家好,有人购买了 Apress Pro Asp.net MVC Framework 3 的 ALPHA 并创建了 SportsStore 吗?我无法终生编辑产品并成功更新数据库?没有显示错误并且单元测试所有功能,但没有成功的“编辑”,即我更改了一些细节,单击保存,它报告成功 - 然后我检查结果,没有任何事情发生?其他人在通过 SportsStore 工作时发现了这个吗?任何建议将不胜感激。

干杯。

【问题讨论】:

  • 对于那些有同样问题的人,我不得不在 EFProductRepository / SaveProduct 中添加:context.Entry(product).State = EntityState.Modified; //using system.data;。否则对我不起作用 - 我隐含地遵循了这些例子。
  • 天啊,我以为我做错了什么!好问题在这里! ++1
  • 我无法让源代码工作 有人可以压缩一个工作版本吗?我编译得很好,但它似乎与 Ninject 有问题

标签: asp.net-mvc-3 frameworks errata


【解决方案1】:

保存前需要更新EF对象的状态。

public void SaveProduct(Product product)
        {
            if (product.ProductID == 0)
            {
                context.Products.Add(product);
            }
            else
            {
                context.Entry(product).State = System.Data.EntityState.Modified;
            }


            int result = context.SaveChanges();

        }

【讨论】:

    【解决方案2】:

    我还不能发布 cmets,但我想通过展示你的最终方法应该读什么来添加到 MVC 新手的评论:

    public void SaveProduct(Product product) {
        if (product.ProductID == 0) {
            context.Products.Add(product);
        } else {
            context.Entry(product).State = EntityState.Modified;
        }
        int numSaved = context.SaveChanges();
    }
    

    另外不要忘记添加额外的 using 语句(再次如 MVC 新手所提到的):

    //using system.data;
    

    【讨论】:

    • 希望这可以帮助其他人(不幸地把他们的钱浪费在这本 Apress 书上) 不要像我一样在这个问题上浪费时间。使用本书时要记住的主要事情是,当您的代码不起作用时,不要假设是您自己错了。通常它会是本书的代码。如果它不起作用,请在此处搜索代码。 ;) 虽然我觉得我从本书的错误中学到了更多(而且它有很多!) 比本书的其余部分!哈哈
    【解决方案3】:

    尝试以下方法。这个想法是 MVC 模型绑定到 Action 方法的产品参数没有与 EF 同步,因此我们需要将其关联到存储库:

    public ActionResult Edit(Product product)   
    {
        if (ModelState.IsValid)
        {
            ((ObjectSet<Product>)repository.Products).ApplyCurrentValues(product);
    
            repository.SaveProduct(product);
            TempData["message"] = string.Format("{0} has been saved", product.Name);
            return RedirectToAction("Index");
        }
        else 
        {
            return View(product);
        }
    }
    

    【讨论】:

      【解决方案4】:

      我在使用 Apress Pro ASP.NET MVC3 的最终版本时遇到了同样的问题。使用 Visual Studio 调试器时,我注意到在执行 context.SaveChanges()(SportsStore.Domain.Concrete.EFProductRepoistory) 时,上下文并未更改为我们在编辑视图中所做的更改。虽然 SaveProduct() 的构造函数中定义的产品

      所以我猜我们所要做的就是将 Context.Products.Product 更改为构造函数中的产品,如下所示:

              else
              {
                  context.Products.Find(product.ProductId) = product;
              }
      

      不幸的是 Visual Studio 给了我这个错误:

      错误1 赋值的左边必须是变量、属性或索引器

      所以为了让它发挥作用,我必须这样做:

              else
              {
                  context.Products.Find(product.ProductID).Name = product.Name;
                  context.Products.Find(product.ProductID).Description = product.Description;
                  context.Products.Find(product.ProductID).Category = product.Category;
                  context.Products.Find(product.ProductID).Price = product.Price;
              }
      

      这确实有效。但是我认为这远非理想,也不是最好的方法。

      有没有一种方法可以做到这一点,我只需在上下文中编辑/更新整个 Product 对象,而不是一个一个地编辑每个属性?

      【讨论】:

        【解决方案5】:
        public void SaveProduct(Product product)
        {
            var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
            if (product.ProductID > 0)  
            {
                context.Products.Remove(prod);
            }
            context.Products.Add(product);            
            context.SaveChanges();
        }
        

        【讨论】:

          【解决方案6】:

          试试这个

           public ActionResult Edit(Product product)
              {
                  if (ModelState.IsValid)
                  {
                      Product p = repository.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
                      if (p != null)
                      {
                          p.ProductID = product.ProductID;
                          p.Price = product.Price;
                          p.Category = product.Category;
                          p.Description = product.Description;
                          p.Name = product.Name;
                      }
                      else
                          p = product;
                      repository.SaveProduct(p);
                      TempData["message"] = string.Format("{0} has been saved", product.Name);
                      return RedirectToAction("Index");
                  }
                  else 
                  {
                      return View(product);
                  }
              }
          

          我是 mvc 3 的初学者,但我认为模型引用(产品参数)是一个未绑定到 EF 上下文的产品对象

          【讨论】:

            【解决方案7】:

            这就是答案

            public void SaveProduct(Product product)
                {
                    var prod = context.Products.SingleOrDefault(p => p.ProductID == product.ProductID);
            
                    if (product.ProductID > 0)
                    {
                        context.Products.Remove(prod);
                    }
                        context.Products.Add(product);            
                        context.SaveChanges();
                }
            

            【讨论】:

            • 这将创建一个具有与原始 ID 不同的新产品。这也是我第一次尝试解决这个问题。这也使得对数据库的请求比严格需要的要多。
            猜你喜欢
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 1970-01-01
            • 2012-01-22
            • 1970-01-01
            • 1970-01-01
            • 2020-06-22
            • 1970-01-01
            相关资源
            最近更新 更多