Entity Framework - частичная фиксация - PullRequest
4 голосов
/ 24 октября 2009

В течение некоторого времени я задавался вопросом, есть ли какой-либо способ в Entity Framework сохранить некоторые изменения в базе данных, а другие нет. Представьте себе ситуацию, в которой я имею, скажем, 4 класса сущностей - Customer, Task, SalesSchema и Address. Каждый из них - это взаимоотношения клиентов со многими. Теперь я создаю окно с 3 вкладками (используя TabControl), каждая из которых имеет DataGridView, в котором перечислены адреса, задачи и схемы продаж, а также для каждой из этих кнопок (добавление, изменение, удаление) для обработки сведений о каждом типе объекта. 1001 *

Что я хочу сделать, так это разрешить частичное внесение изменений в базу данных, например. пользователь добавляет задачу -> она должна быть сохранена немедленно, когда пользователь нажимает сохранить изменения, но должны быть сохранены только изменения из активной вкладки. (не спрашивайте меня, почему я должен это делать - это то, чего хочет клиент)

Теперь это достигается созданием отдельных контекстов данных и фиксацией каждого из них в отдельности, но мне интересно, есть ли другой способ сделать это - использовать один контекст объекта.

В наборах данных ADO.NET был способ фиксации изменений по отдельности - получить изменения, нанять необходимый персонал или даже отклонить изменение.

Возможно ли это с помощью ADO.NET Entity Framework?

Ответы [ 2 ]

1 голос
/ 12 ноября 2009

Я не уверен, правильно ли я понимаю вашу проблему правильно, но большинство требований должно быть легко обработано в одном контексте. Ниже приведен простой пример возврата всех объектов определенного типа в их исходное состояние, если после этого вы должны вызывать SaveChanges () для контекста - только оставшиеся объекты в добавленном или измененном состоянии будут фиксироваться - частичное принятие.

foreach (System.Data.Objects.ObjectStateEntry x in MyEntity.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) // or modified for that matter.
{
   if (x.EntityKey != null)
   {  
      if (x.Entity is MyClass) // look haven't tested this code, merely example and may have typo's
      {
         MyClass tmpObject = (MyClass)x.Entity;
         MyEntity.Refresh(RefreshMode.StoreWins, x);
      }
   }
}

Суть, которую я пытаюсь донести, заключается в том, что вам доступен большой контроль, если вы отслеживаете элементы, которые хотите «частично» зафиксировать. Те, которые вы хотите вернуть в исходное состояние или отменить, могут быть возвращены или даже полностью удалены из контекста.

Не уверен, поможет ли это кому-нибудь. Желаем удачи.

1 голос
/ 25 октября 2009

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

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