2011-01-03 4 views
1

У меня возникли проблемы с сохранением изменений, внесенных в мой POCO обратно в базу данных.Сохранение изменений POCO

Когда приложение запускается, я захватываю все объекты, которые мне нужны, в объекты POCO, а затем, когда я нажимаю кнопку «Сохранить», я создаю новый экземпляр объекта ObjectContext, затем мне нужно зацикливать объекты, прикрепить их к контексту , а затем обнаруживать изменения и сохранять.

public void SaveData() { 
     using (SolEntities sec = new SolEntities(_cxnStr)) { 
      foreach (ExtViews.Planet p in Planets) { 
       sec.CelestialBodies.Attach(p.TheBody); 
       sec.CelestialBodies.ApplyCurrentValues(p.TheBody); 
      } 
      sec.SaveChanges(SaveOptions.AcceptAllChangesAfterSave | SaveOptions.DetectChangesBeforeSave); 
     } 
    } 

Но это не похоже на работу, 2 способа я мог заставить его работать было либо: А) Создание локального списка планет перед циклом foreach (чтобы заставить их быть сгенерированы из Db, прежде чем применять измененные значения, которые я предполагаю), и удалите Attach. или B) Переключите ApplyCurrentValues линию для этого:

sec.ObjectStateManager.ChangeObjectState(p.TheBody, System.Data.EntityState.Modified); 

Но вручную заставляя ObjectState к модифицирована для каждого объекта кажется немного излишним, особенно если они не были изменены, я мог держать что-то с внутренней стороны был ли он изменен или нет, но я думал, что ApplyCurrentValues ​​сделает это в первую очередь?

+0

Отметьте мой ответ здесь: http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326 Это объясняет, почему вы должны установить состояние для каждый объект - при использовании отключенных объектов необходимо выполнить синхронизацию вручную. –

ответ

3

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

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

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