Отслеживает ли ObjectContext уже выбранные объекты при их повторном получении? - PullRequest
1 голос
/ 21 июля 2011
  1. Я получаю объект из базы данных (объект POCO с прокси)
  2. Я изменяю его свойство без сохранения изменений
  3. Позже я получаю его снова из базы данных (я использую тот же контекст объекта)
  4. Какова стоимость имущества?

Например, если у меня есть контекст объекта с коллекцией Users, то каков результат следующего:

ObjectContext o = ....;
User u = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // I get 'test' for example
u.LastName = 'SomethingElse';
u  = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // What is the result??

Если результатом последнего оператора не является строка "SomethingElse", то есть ли способ достичь этой функциональности?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Это основная функция инструментов ORM, называемая шаблон карты идентификации .Объект с уникальным ключом может быть материализован только один раз для каждого контекста, поэтому второй запрос по умолчанию будет использовать тот же экземпляр без изменения его значений.

Вы можете заставить запрос обновить значения либо:

ObjectContext o = ....;
User u = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // I get 'test' for example
u.LastName = 'SomethingElse';
o.Users.MergeOption = MergeOption.OverwriteChagnes; // Here you change the behavior
u  = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // result is 'test' again

, либо перезагрузив сам объект:

ObjectContext o = ....;
User u = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // I get 'test' for example
u.LastName = 'SomethingElse';
o.Refresh(RefreshMode.StoreWins, u); // Here you reload entity with values from the database
Console.WriteLine(u.LastName); // result is 'test' again    
0 голосов
/ 21 июля 2011

Да, есть менеджер идентификаторов, который возвращает тот же объект , если он видит, что тот же идентификатор записи возвращается из базы данных.

Таким образом, результат должен быть "SomethingElse", если вы не отключите диспетчер идентификации.

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