12

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

干杯。

4

7 回答 7

12

保存前需要更新 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();

        }
于 2011-09-08T18:19:00.743 回答
3

我还不能发表评论,但我想通过展示你的最终方法应该读什么来添加到 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 Newbie 所述):

//using system.data;
于 2011-09-15T07:56:53.493 回答
1

尝试以下方法。这个想法是 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);
    }
}
于 2011-07-25T10:45:18.460 回答
0
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();
}
于 2011-11-19T18:33:10.567 回答
0

我在使用 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 对象,而不是一个一个地编辑每个属性?

于 2011-08-15T16:38:22.317 回答
-1

尝试这个

 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 上下文的产品对象

于 2011-07-20T03:15:34.810 回答
-1

这是答案

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();
    }
于 2011-11-19T18:43:12.233 回答