Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataContext Update ? немогу изменить запись 
:(
    Опции темы
Onics2
  Дата 2.6.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



Здравствуйте! 
Столкнулся с проблемой обновления(UPDATE) записи в таблице БД через datacontext.

Делаю таким образом:
Код

        public static void EditCurrency(Currency newCur)
        {

            using (WareHouseDataContextDataContext context = new WareHouseDataContextDataContext())
            {
                Currency oldCur = context.Currencies.Single(e => e.CurrencyID == newCur.CurrencyID);
                context.Currencies.Attach(newCur, oldCur);
                context.SubmitChanges();
            }
        }

Падает исключительная ситуация:
InvalidOperationException was unhandled
Value of member 'CurrencyID' of an object of type 'Currency' changed.
A member defining the identity of the object cannot be changed.
Consider adding a new object with new identity and deleting the existing one instead.


Иногда примечание изменялось(код немного изменял когда):
InvalidOperationException was unhandled
Cannot attach an entity that already exists.


Вобщем никак не могу обновить запись, может вобще все неправильно... :(
 

PM MAIL   Вверх
KelTron
Дата 3.6.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



В сообщении об ошибке всё написано.
Он не может изменить ID у записи, потому что это первичный ключ. 
Вместо этого создай новую запись, а старую удали. Или в старой записи измени все поля кроме ID на новые.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
montergerdimachi
Дата 4.6.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.6.2009

Репутация: нет
Всего: нет



Добрый день,

Столкнулся с похожей проблемой.
Проблема в том, что требуется только обновить значения, и зачем для этого делать удаление и потом вставку мне непонятно.

У меня она возникает в одном случае, 
есть простой DAO в нем 2 метода create и update когда вызываешь  их по отдельности оба работают хорошо.
Но, в одном из случаев, чтобы заполнить объект полностью мне необходим его уникальный идентификатор, который,
в свою очередь, создается базой данный (PK autoincrement). В этом случае, при вызове метода обновления выскакавает
такая же ошибка

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

Код

      ///// DAO
      public Post create(Post fPost)
         {
            try
               {
                  fPost.DateCreate = DateTime.Now;
                  fPost.DateModified = DateTime.Now;
                  fPost.Comments = 0;
                  fPost.Category = (from cat in dataContext.Categories where cat.Id == fPost.CategoryId select cat).FirstOrDefault();
                  fPost.Status = "created";
                  fPost.Importance = 9999;

                  if(fPost.GetRuleViolations().Count() > 0)
                     throw new ObjectValidationException("Rule violations prevent saving", fPost.GetRuleViolations());

                  dataContext.Posts.InsertOnSubmit(fPost);
                  dataContext.SubmitChanges();
                  return fPost;
               }
            catch (ObjectValidationException e)
               {
                  throw e;
               }
            return null;
         }

      public LkBlogPost update(Post fPost)
         {
            try
            {
               Post tPost = this.post(fPost.Id);
               if(tPost == null)
                  return null;
               if(tPost.CategoryId != fPost.CategoryId)
                  {
                     tPost.Category = (from cat in dataContext.Categories where cat.Id == fPost.CategoryId select cat).FirstOrDefault();
                     tPost.CategoryId = fPost.CategoryId;
                  }
               tPost.Title = fPost.Title;
               tPost.Content = fPost.Content;
               tPost.DateModified = DateTime.Now;
               tPost.ImagePath = fPost.ImagePath ?? "";
               dataContext.SubmitChanges();
               return tPost;
            }
            catch(ObjectValidationException e)
            {
               throw e;
            }
            return null;
         }


     ///// Создание объекта в веб-контроллере
                       entryParams... - заполнение полей
                       LkBlogPost tPost = this.pBlogManager.create(entryParams);
                       if(tPost == null)
                          {
                             ModelState.AddModelError("CreateError", "Object Not Created");
                          }
                       else
                          {
                             tPost.ImagePath = this.processImage(tPost);
                             ....
                             this.pBlogManager.update(tPost);
                             return RedirectToAction("Post", new { post = tPost.Id });
                          }


PM MAIL   Вверх
KelTron
Дата 5.6.2009, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



Цитата(montergerdimachi @  4.6.2009,  18:53 Найти цитируемый пост)
и зачем для этого делать удаление и потом вставку мне непонятно

Это просто перевод того, что написано в сообщении об ошибке.

Чтобы обновить запись просто находим её в БД, изменяем какие то значения и фиксируем изменения.

Код

void UpdateEmployee(int emplID, ...)
{
    Employee empl = dc.Employees.Single(e => e.EmployeeID == emplID);
    empl.Name = ...
    empl.Post = ...
    empl.Salary =...
    ...
    dc.SubmitChanges();
}



Это сообщение отредактировал(а) KelTron - 5.6.2009, 05:14


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
montergerdimachi
Дата 5.6.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.6.2009

Репутация: нет
Всего: нет



Хм, в моем методе update присутствует вызов этого метода, если ты не заметил, проблема, скорее всего, кроется в другом.
Свойства объекта передаются в экземпляре такого же класса, что позволяет уменьшить количество параметров необходимых передать методу.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.