Сохранение изменений POCO - PullRequest
1 голос
/ 03 января 2011

У меня проблемы с сохранением изменений, внесенных в мой 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);
        }
    }

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

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

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

Ответы [ 2 ]

3 голосов
/ 03 января 2011

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

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

0 голосов
/ 03 января 2011

msdn - предложить к использованию,

context.ObjectStateManager.TryGetObjectStateEntry(newItem, out entry);

Также посмотрите на Отслеживание изменений на основе снимков .

...