2010-07-23 4 views
1

У меня есть служба WCF, которая использует структуру сущности для извлечения записей из базы данных и сопоставления их с объектами POCO. Эти объекты POCO затем возвращаются в клиентское приложение.Entity Framework 4 Контекстная стойкость POCO через службы

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

ответ

1

Проблема заключается в том, что EF отслеживает прикрепленные объекты, используя собственный «уникальный идентификатор» для каждого извлеченного объекта, отличный от первичного ключа записи в вашей базе данных. Это свойство, конечно, не отмечено атрибутом DataMember, поэтому при отправке по службе WCF вы теряете ключ, который использовался EF, чтобы отслеживать его. При десериализации объекта это уже не тот же самый точный объект, а еще один более простой, содержащий только свойства, отмеченные атрибутом DataMember. Поэтому, когда служба возвращает их обратно, вы, конечно, теряете связь между объектом и EF.

Вы пытались подключить объект к контексту? Я думаю, что это должно сработать, но я не пробовал это сам.

+0

вы просто вызываете метод Attach в таблице, предоставляя объект POCO в качестве параметра. это очень просто. http://msdn.microsoft.com/en-us/library/bb896271.aspx – scripni

+0

Спасибо, я только что попробовал это, и я могу добавить его в контекст с помощью AttachTo, но когда я вызываю context.SaveChanges() изменения не отражаются в базе данных. Я предполагаю, что это связано с тем, что контакт не считает, что он был изменен, поэтому он не сохраняет его. – Gavin

+2

Обнаружена проблема, так как отслеживание изменений было потеряно, вам необходимо вручную установить его как измененный после его присоединения, выполнив что-то вроде этого context.ObjectStateManager.ChangeObjectState (service, EntityState.Modified); – Gavin

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