Сохранение одного объекта вместо всего контекста - PullRequest
3 голосов
/ 19 августа 2009

Я столкнулся со сценарием, в котором мне необходимо записать изменения дочерней сущности ассоциации «один ко многим» в базу данных, но не сохранять изменения, внесенные в родительскую сущность.

В настоящее время Entity Framework имеет дело с фиксацией базы данных в контексте контекста (EntityContext.SaveChanges ()), который имеет смысл для обеспечения взаимосвязей и т. Д. Но мне интересно, есть ли лучшая практика или, возможно, рекомендуемый путь о точных фиксациях базы данных на отдельных объектах вместо всего контекста.

Ответы [ 3 ]

8 голосов
/ 19 августа 2009

Лучшие практики? Вы имеете в виду, кроме того, «Не делай этого!»?

Я не думаю, что есть лучший способ сделать ObjectContext отличным от состояния базы данных.

Если вы должны это сделать, я бы создал новый ObjectContext и внес в него изменения дочерней сущности. Таким образом, оба контекста согласованы.

4 голосов
/ 29 декабря 2010

У меня есть аналогичная потребность. Решение, которое я рассматриваю, состоит в том, чтобы реализовать свойства оболочки для всех сущностей, которые хранят любые изменения свойств в частном порядке, не влияя на фактическое свойство сущности. Затем я добавил бы к объекту метод SaveChanges (), который записал бы изменения в объект, а затем вызвал бы SaveChanges () для контекста.

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

Единственное другое решение, которое я могу придумать, - после сохранения изменений сохранить состояния всех измененных / добавленных / удаленных сущностей, установить их неизмененными, кроме той, которую вы меняете, сохранить изменения и затем восстановить состояния других субъектов. Но это звучит потенциально медленно.

2 голосов
/ 20 августа 2009

Это может быть достигнуто с помощью AcceptAllChanges ().

Внесите изменения в родительский объект, вызовите AcceptAllChanges (), затем внесите изменения в связанные объекты и вызовите SaveChanges (). Изменения, которые вы внесли в родительский объект, не будут сохранены, поскольку они были «зафиксированы» для объекта, но не сохранены в базе данных.

using (AdventureWorksEntities adv = new AdventureWorksEntities())
{
     var completeHeader = (from o in adv.SalesOrderHeader.Include("SalesOrderDetail")
                             where o.DueDate > System.DateTime.Now
                             select o).First();
     completeHeader.ShipDate = System.DateTime.Now;
     adv.AcceptAllChanges();
     var details = completeHeader.SalesOrderDetail.Where(x => x.UnitPrice > 10.0m);
     foreach (SalesOrderDetail d in details)
     {
          d.UnitPriceDiscount += 5.0m;     
     }
          adv.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...