Ошибка в универсальном методе обновления объекта (структура сущностей 4) - PullRequest
2 голосов
/ 18 марта 2011

Я занимаюсь разработкой приложения с использованием EF4 и создал общий метод, но генерирую эту ошибку.

Метод:

public Boolean change (T)
{
    ctx.ApplyCurrentValues ​​<T> (t.GetType (). Name, t);
    return save ();
}

И ошибка, которая есть у Герендо, такова:

Объект с ключом, который совпадает с ключом предоставленного объекта, не может быть найден в ObjectStateManager. Убедитесь, что значения ключа предоставленного объекта соответствуют значениям ключа объекта, к которому необходимо применить изменения.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 3 ]

1 голос
/ 18 марта 2011

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

Вы можете изменить свой метод на:

public Boolean Change<TEntity>(TEntity entity)  where TEntity : EntityObject
{
    // Loads object from DB only if not loaded yet
    ctx.GetObjectByKey(entity.EntityKey);  
    ctx.ApplyCurrentValues​​<T>(entity.GetType().Name, entity);
    ctx.SaveChanges();
}
0 голосов
/ 18 марта 2011

Предполагая, что вы хотели напечатать что-то вроде этого:

public Boolean change<T> (T t)  where T : EntityObject
{
   ctx.ApplyCurrentValues​​<T>(t.GetType().Name, t);
   return save();
}

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

В SO есть несколько примеров того, как сделать это либо с заглушкой, либо запросив сущность с тем же идентификатором из БД, но я еще не видел универсальной версии.

EntityFramework .net 4 Обновление сущности простым методом

Entity Framework 4 - Где разместить логику "ApplyCurrentValues"?

0 голосов
/ 18 марта 2011

Я не уверен, как вы вообще скомпилировали это, поскольку вы использовали круглые скобки (T), вставленные в угловые скобки <T>, и пропустили параметр t.То есть:

public Boolean change<T>(T t) 
{     
  ctx.ApplyCurrentValues <T> (t.GetType (). Name, t);     
  return save (); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...