Попытка обновить сущности от отключенной сущности - PullRequest
1 голос
/ 20 декабря 2011

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

То, о чем я говорю, - это отключенные сущности в EF, которые должны обновлять существующие сущности в базе данных.

Я приведу пример моей проблемы здесь (этот пример - последний раз, когда я сталкивался с этой проблемой, чтозаставил меня написать этот вопрос).

У меня есть служба WCF, которая также использует Entity Framework.Другая программа, добавившая ссылку на службу в мою службу, получила обычные прокси-версии сущностей.

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

Мой метод теперь выглядит примерно так:

public bool ChangeEntity(MyEntity entity, int otherTableForignKey)
{
  //first I verify that the entity to update exist in the system
  var entitytochange = entityContext.MyEntities.FirstOrDefault(e => e.Name == entity.Name);
  if (systemtochange == null) return false;
  try
  {
    entity.ForignEntity = entityContext.ForeignEntities.FirstOrDefault(f => f.Key == otherTableForignKey);
    //code for updating the entity should go here, but I'm nor sure what
    entityContext.SaveChanges();
    return true;
  }
  catch (Exception exc)
  {
    return false;
  }
}

Я пробовал много разных комбинаций ApplyCurrentValues, Attach, установив ObjectState в значение Modified ии так далее, но я получаю либо сообщение об ошибке, что не могу добавить новый объект с тем же ключом, что и существующий объект, что состояние объекта нового объекта не может быть добавлено, и т. д.

Итак, мой вопрос: каков наилучший способ сделать это без написания кода, который выглядит как большой взлом.

Единственный способ, которым я получил эту работу сейчас, - это просто установить свойства entitytochange вручную с помощьюсвойства entity, но это плохое решение, так как любые добавленные свойства к MyEntity будут нарушать код, если я не помню, чтобы добавить код и в этот метод, и кажется, что действительно должен быть другой способлучше.

РЕДАКТИРОВАТЬ

Когда я ставлю entityContext.MyEntities.ApplyCurrentValues(entity); там, где размещен мой комментарий, я получаю следующее исключение в этой строке:

The existing object in the ObjectContext is in the Added state. Changes can only be applied when the existing object is in an unchanged or modified state.

Однако, если я уберу эту строку вышеentity.ForignEntity = entityContext.ForeignEntities.FirstOrDefault(f => f.Key == otherTableForignKey); тогда ApplyCurrentValues работает без проблем.

Зачем мне устанавливать ForeignEntity объекта в состояние «Добавлено»?Таким образом, кажется, что установка свойства для объекта Detached присоединяет его к контексту с состоянием добавления?

...