2012-04-10 3 views
0

У меня есть класс продукта:класс Update, который имеет другой класс

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Amount { get; set; } 

    public virtual Brand Brand { get; set; } 
} 

Я пытаюсь обновить модель сделать это:

[HttpPost] 
public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     product.Brand = db.Brands.Find(product.Brand.Id); 

     db.Entry(product).State = EntityState.Modified; 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(product); 
} 

Проблема заключается в том, что все мои свойства обновляются, но Бренд !! Как это сделать, чтобы обновить его?


Если я:

[HttpPost] 
public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
      db.Products.Attach(product); 

      product.Brand = db 
       .Brands 
       .Find(2); // << with a static value 

      db.Entry(product).State = EntityState.Modified; 

      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     return View(product); 
} 

это работает ... но если я пытаюсь это ниже, даже несмотря на то, BrandId 2, он не работает:

[HttpPost] 
    public ActionResult Edit(Product product) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Products.Attach(product); 

      int BrandId = product.Brand.Id; 

      product.Brand = db 
       .Brands 
       .Find(BrandId); 

      db.Entry(product).State = EntityState.Modified; 

      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     return View(product); 
    } 
+0

Ваш код не задан другой Бренд. Вы выбираете Бренд, который уже есть. –

+0

В представлении бренд является выпадающим списком, поэтому параметр продукта имеет идентификатор бренда = 1, но все остальные свойства являются нулевыми .. даже если я делаю «db.Entry (product.Brand) .State = EntityState.Modified; ', it не работает. – MuriloKunze

+0

Вам, вероятно, необходимо подключить Продукт к контексту. –

ответ

1

Вы должны обработать обновление отношений между Product и Brand отдельно. На отношение не влияет установка вручную вручную Modified. Это особенно важно, чтобы загрузить Brand (вместе с продуктом) из БД первого, в противном случае EF не может обнаружить, если отношения изменились или нет:

[HttpPost] 
public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     var productInDB = db.Products.Include(p => p.Brand) 
      .Single(p => p.Id == product.Id); 

     // Update scalar properties 
     db.Entry(productInDB).CurrentValues.SetValues(product); 

     // Update relationship between product and brand 
     if (product.Brand == null && productInDB.Brand != null) 
      productInDB.Brand = null; 
     else if (product.Brand != null && (productInDB.Brand == null 
      || product.Brand.Id != productInDB.Brand.Id)) 
     { 
      db.Brands.Attach(product.Brand); 
      productInDB.Brand = product.Brand; 
     } 

     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(product); 
} 

Эта процедура становится намного проще, если ввести ключевое свойство иностранного BrandId в вашем объекте Product и установите этот product.BrandId на вид вместо product.Brand.Id. В этом случае настройка состояния на Modified будет работать, потому что BrandId является скалярным свойством.

Смежные вопросы