Путаница с контекстом Entity Framework - PullRequest
1 голос
/ 07 марта 2012

Я немного запутался в отношении того, как работает dbContext в EF.

Если я сделаю что-то вроде _context.Persons.Add(_person) (если предположить, что человек является допустимым объектом), если я тогда (перед вызовом _context.SaveChanges ()) query Persons, будет ли только что добавленный человек включен в результаты?

Например:

Person _person = new Person() {Firstname = "Bill", Lastname = "Snerdly"};
_context.Persons.Add(_person);
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne"));

Всякий раз, когда я пытаюсь это сделать, создается впечатление, что контекст теряет связь стот факт, что я добавил этого нового человека в контекст.

Что меня смущает, так это то, что если я редактирую существующего человека, присоединяю человека и устанавливаю измененное состояние, запрос контекста, кажется, отслеживаетвнесенные изменения и возвращает их в результаты.Например:

//Assuming that Person 5 exists with the name William Snerdly
Person _person = new Person() {Id = 5, Firstname = "Bill", Lastname = "Snerdly"};
_context.Persons.Attach(_person);
_context.Entry(_person).State = System.Data.EntityState.Modified;
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne"));

В этом случае, похоже, что человек с идентификатором 5 появится в списке с именем Билл вместо Уильяма.Таким образом, контекст запрашивал данные, но сохранял изменения, тогда как в первом сценарии контекст запрашивал данные, но игнорировал любые добавленные элементы.Это просто кажется немного противоречивым.

Я правильно понимаю, или я что-то упустил?

Спасибо за вашу помощь с этим.

1 Ответ

3 голосов
/ 07 марта 2012

Нет, так как он еще не существует в базе данных.Однако он будет доступен через ObjectStateManager ObjectContext или, в качестве альтернативы, если вы используете оболочки DbContext / DbSet, через свойство .Local объекта DbSet.

В случае редактирования,вы видите кэш первого уровня ORM на работе.Запрос выполняется к базе данных (и поэтому сравнивается со значениями в нем - ваш пример станет еще более странным, если вы изменили Фамилию в контексте, но все же получите результат запроса, ищущего неизмененное Фамилия), но когда егоРезультаты обрабатываются, сначала проверяется идентификатор возвращаемого объекта, и поскольку объект с таким идентификатором уже присутствует в контексте, вы возвращаете этот экземпляр обратно.Это режим работы по умолчанию " AppendOnly ".

Я не знаю, что вы хотите сделать, но я должен был все это понять, когда хотел проверить свои изменения в соответствии справила, которые должны использовать значения как загруженных, так и непрочитанных объектов.Я закончил тем, что начал транзакцию, сохранил изменения с опциями « None », выполнил мои запросы проверки снова к базе данных (которая затем содержала «объединенное» представление данных) и откатил транзакциюесли данные были неверными, или принимает изменения и в противном случае совершает транзакцию.

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