Когда использовать ApplyOriginalValues ​​в Entity Framework 4? - PullRequest
8 голосов
/ 07 апреля 2011

Я использовал ApplyCurrentValues.

Но не совсем понимаю ApplyOriginalValues. Чем он отличается от ApplyCurrentValues? Когда я должен использовать это?

Я прочитал документацию. Но все еще в замешательстве.

Ответы [ 3 ]

14 голосов
/ 07 апреля 2011

Каждая сущность, загруженная из базы данных, содержит два набора значений - исходные (загруженные из БД) и текущие (изменяемые вами). Эти два набора содержатся в ObjectStateEntry. Обычно каждое сохранение сопровождается принятием изменений, которые принимают текущие значения и записывают их в исходные значения. Если вы знаете, что вы внесли изменения в объект за пределами EF (например, вызвав хранимую процедуру с помощью обычного ADO.NET EF), вы можете заставить EF узнать об этих изменениях без перезагрузки объекта, используя ApplyOriginalValues. Я думаю, что использование этого метода довольно редко. Например, я использовал ApplyOriginalValues в этот ответ .

2 голосов
/ 15 мая 2011

Вызов любого метода зависит от того, был ли прикреплен исходный или обновленный объект. http://msdn.microsoft.com/en-us/library/bb896248.aspx

1 голос
/ 19 сентября 2012

Я только недавно использовал метод ApplyOriginalValues ​​() для использования в сценарии мягкого или логического удаления.

Мы используем Entity Framework 4.1 и реализовали логическое / мягкое удаление, когда контекст сохраняет изменения.

Приведенный ниже код проверяет, удален ли объект, а затем проверяет, реализует ли он соответствующий интерфейс. Если это так, мы изменяем состояние объекта с удаленного на измененное и применяем исходные значения (entry.ApplyOriginalValues ​​()), а также устанавливаем флаг удаления.

if (entry.State == EntityState.Deleted)
                {
                    if (entry.Entity is IEnforceLogicalDelete)
                    {
                        IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete;
                        ObjectStateManager.ChangeObjectState(entry.Entity, EntityState.Modified);
                        entry.ApplyOriginalValues(entry.Entity);
                        delete.IsDeleted = true;
                    }
                }

Первоначально у нас была проблема, когда свойства навигации устанавливались в NULL или были пустыми при логическом удалении. Метод ObjectContext.DeleteObject () помечал все свойства навигации для удаления до того, как было инициировано событие Context.SavingChanges (). При изменении состояния с удаленного на измененное свойства внешнего ключа по-прежнему стирались. Я пытался найти ловушку для метода RevertDelete () (ILSpy очень полезен), но ApplyOriginalValues ​​() сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...