Apress Pro Asp.net MVC Framework 3 - SportsStore Редактировать Продукт не работает? - PullRequest
12 голосов
/ 15 июня 2011

G'day All, кто-нибудь купил АЛЬФА Apress Pro Asp.net MVC Framework 3 и создал SportsStore?Я не могу на всю жизнь редактировать продукты и успешно обновлять БД?Ошибки не отображаются, и все модульные тесты функционируют, но нет успешного «редактирования», т. Е. Я изменяю некоторые детали, нажимаю «Сохранить», он сообщает об успешном выполнении - я проверяю результаты, и ничего не произошло?Кто-нибудь еще находил это при работе через SportsStore?Любые советы будут с благодарностью.

Ура.

Ответы [ 7 ]

12 голосов
/ 08 сентября 2011

Состояние объекта 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();

        }
3 голосов
/ 15 сентября 2011

Я пока не могу оставлять комментарии, но я хотел бы добавить к комментарию MVC Newbie, показывая, что должен читать ваш последний метод:

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;
1 голос
/ 25 июля 2011

Попробуйте следующее. Идея продукта заключается в том, что привязка модели 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);
    }
}
0 голосов
/ 19 ноября 2011

Вот ответ

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();
    }
0 голосов
/ 19 ноября 2011
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();
}
0 голосов
/ 15 августа 2011

Я столкнулся с той же проблемой, используя финальную версию Apress Pro ASP.NET MVC3.Используя отладчик Visual Studio, я заметил, что при выполнении context.SaveChanges() (SportsStore.Domain.Concrete.EFProductRepoistory) контекст не изменялся на изменения, которые мы внесли в представление Edit.Хотя продукт, определенный в конструкторе 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 внутри контекста, а не редактировал каждое свойство одно за другим?

0 голосов
/ 20 июля 2011

попробуйте

 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, но я думаю, что ссылка на модель (параметр продукта) - это объект Product, который не привязан к контексту EF

...