Хорошо, каждый раз, когда я попадаю в эту ситуацию, я борюсь взад и вперед, пока не найду способ ее решить (и обычно это не тот способ, которым мне бы хотелось ее решить).
То, о чем я говорю, - это отключенные сущности в 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 присоединяет его к контексту с состоянием добавления?