AcceptAllChanges заставляет Entity Framework ... не принимать изменения? - PullRequest
9 голосов
/ 21 февраля 2011

Я использую .NET 3.5 SP1. У меня есть простой скрипт, который удаляет некоторые объекты.

var people = (from Person p in context.People
              where p.FirstName == "Testy" && 
                    p.LastName == "McTesterson"
              select p).ToList();
people.ForEach(p => context.DeleteObject(p));

//context.AcceptAllChanges();
context.SaveChanges();

Если я раскомментирую AcceptAllChanges(), объекты не удаляются. Если я оставлю это в комментариях, объекты будут удалены. Почему EF ведет себя так? Это кажется контрпродуктивным.

1 Ответ

17 голосов
/ 21 февраля 2011

Это поведение AcceptAllChanges.Принятие изменений «сбрасывает» внутреннее состояние ObjectContext.Это означает, что все сущности, которые были добавлены или изменены, установлены в состояние «без изменений» , и все сущности, которые были удалены, отделены от контекста.

В отличие от этого, метод SaveChanges повторяет внутреннее состояние ObjectContext и создает команды INSERT db для каждого объекта с состоянием добавлено , команда UPDATE db для каждого объекта в изменено состояние и команда DELETE db для каждого объекта в удалено состояние.SaveChanges по умолчанию принимает все изменения после выполнения всех команд.

Если вы запускаете AcceptAllChanges до SaveChanges, вы удаляете все изменения и нечего выполнять в БД.Причина, по которой этот метод существует, заключается в том, что вы можете отключить поведение по умолчанию SaveChanges;в таком случае вы должны принять изменения вручную после выполнения SaveChanges.В противном случае следующий вызов SaveChanges снова выполнит изменения.

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