Apress Pro Asp.net MVC Framework 3 - SportsStore Редактировать Товар не работает?
Gday All, кто-нибудь купил ALPHA Apress Pro Asp.net MVC Framework 3 и создал SportsStore? Я не могу продлить жизнь для меня, отредактировал продукты и успешно обновил БД? Ошибки не отображаются, а модуль проверяет все функции, но не удастся "редактировать, т.е. Я изменяю некоторые детали, щелкаю" Сохранить ", он сообщает об успешном завершении - я затем проверяю результаты, и ничего не произошло? Кто-нибудь еще нашел это, работая через SportsStore? Любые советы будут высоко оценены.
Приветствия.
Ответы
Ответ 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
Я еще не могу отправлять комментарии, но я хотел бы добавить комментарий 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;
Ответ 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);
}
}
im beginner с mvc 3, но я думаю, что ссылка на модель (параметр продукта) является объектом Product, который не связан с EF Context
Ответ 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();
}