2014-01-13 2 views
1

Я новенькая C#, но в основном у нас есть таблица продуктов с большим количеством внешних ключей из других таблиц, таких как поставщиков, торговых марок, производителей и т.д.C#, как обновить отдельные поля

В принципе, я у меня есть форма, в которой я хочу, чтобы пользователь мог обновлять многие продукты на одном экране.

Моя цель - обновить только пару полей, а не все поля из таблицы.

Так, например, список из 10 продуктов на одной странице, каждый продукт представляет собой одну форму, которая представляется через ajax. Все работает нормально, до обновления. Ниже то, что у меня есть:

 if (ModelState.IsValid) 
     { 
      //db.Entry(product).State = EntityState.Modified; 

      db.products.Attach(product); 
      var entry = db.Entry(product); 

      entry.Property(e => e.featured).IsModified = true; 

      try 
      { 
       db.SaveChanges(); 
      } 
      catch (DbEntityValidationException e) 
      { 
       foreach (var eve in e.EntityValidationErrors) 
       { 
        Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
         eve.Entry.Entity.GetType().Name, eve.Entry.State); 
        foreach (var ve in eve.ValidationErrors) 
        { 
         Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
          ve.PropertyName, ve.ErrorMessage); 
        } 
       } 
       throw; 
      } 
     } 

Затем я получил исключение «Entity типа„продукта“в состоянии„Modified“имеет следующие ошибки проверки:» и перечислены все необходимые поля, как supplier_id, Brand_ID и т.д.

Я чувствую, что я рядом, но не могу понять это. Застрял почти неделю.

Любая помощь была бы принята с благодарностью.

Спасибо.

+0

вы подключаете к 'db' и обновление' db2'. Это обычно не работает ... – oerkelens

+0

Ошибка 'Обязательно' bcoz вы упомянули это поле как' Обязательно' в вашей модели – Nilesh

ответ

0

У меня есть исключение «Entity типа„продукта“в состоянии„Modified“ имеет следующие ошибки проверки:» и перечислены все необходимые поля как supplier_id, Brand_ID и т.д.

Поскольку эта ошибка предполагает, что при попытке выполнить db2.SaveChanges(); некоторые из полей не предоставляются, поэтому, возможно, null. Попробуйте проверить свойства объекта, чтобы убедиться, что все, что необходимо, заполнено или не равно нулю.

Кроме того, как комментарий предлагает убедиться, что вы сохранить изменения в самой вещи, вы внести изменения в, так что если вы сделаете изменения в db затем SaveChanges() в db

+0

привет, извините .. Я на самом деле сохраняю его в db, а не db2 ... это был левый из тестов, которые я делал. Теперь я рассмотрю ваши рекомендации и посмотрю, что произойдет. Спасибо, сейчас. – user2881726

+0

Привет, снова ... Я посмотрел, что вы сказали, и имеет смысл загрузить объект (продукт), а затем изменить поля, которые я хочу. Я сделал это сейчас с приведенным ниже кодом, но не уверен, что это хорошее решение: 'product originalProduct = db.products.Find (product.id);' 'originalProduct.featured = product.featured; ' ' – user2881726

+0

Я думаю, что это, как правило, принятый способ сделать это – Coops

0

вы теряете информацию о действиях POST при попытке сохранить изменения. Это связано с тем, что у вас, вероятно, нет каких-либо свойств вашего объекта в форме представления, поэтому контроллер не знает для него значений. Все это происходит потому, что MVC не имеет гражданства.

Простейший способ - просто добавить скрытые поля для всех других, не редактируемых свойств.

@Html.HiddenFor(model => model.Id) 

Эти поля будут включены в POST, и, следовательно, связка будет правильно помещать их в экземпляр вашего объекта.

Но лучшие решения здесь используют модели просмотра - простые классы POCO, которые будут моделями для ваших видов. Использование моделей сущностей напрямую не рекомендуется. При использовании вида модели вы:

  • может контролировать то, что отображается inpormation на представлении,
  • может иметь простую информацию, передаваемую в контроллер
  • может иметь дополнительные, просмотреть конкретную информацию в модели только (не в лице)

Итак, если вы хотите отобразить sth, то вы копируете эту информацию из объекта, чтобы просмотреть модель. В методе сохранения вы делаете это неопознанным способом, обновляя только измененные свойства объекта.

Вот некоторая информация о том, что: http://stephenwalther.com/archive/2009/04/13/asp-net-mvc-tip-50-ndash-create-view-models.aspx

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