Уведомление контекста Entity Framework об изменениях позднее, а не при изменении свойств объекта - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть простой ObjectListView, который отображает некоторые столбцы из EntityFramework объектов, называемых Person (для упрощения). Я загружаю его с Entity Framework в ObjectListview, а затем deatch из Context. У человека есть несколько полей (например, Имя, Фамилия, Файл, ...).

Учитывая, что некоторые файлы имеют размер 5–50 МБ, я не хочу загружать / сохранять их в базе данных без необходимости. Теперь, когда кто-то дважды щелкает по ObjectListView, выбранный Person загружается в поля TextBox. При редактировании любого из полей я проверяю, изменились ли Person Name или SurName и изменились ли они, как в приведенном ниже коде.

    private void test (Person person){
        using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
            context.Persons.Attach(dokument);
            if (person.Name != nameTextBox.Text) {
                person.Name = nameTextBox.Text;
                context.ObjectStateManager.GetObjectStateEntry(person).SetModifiedProperty("Name");
            }
            if (person.SurName != surNameTextBox.Text) {
                person.SurName = surNameTextBox.Text;
                context.ObjectStateManager.GetObjectStateEntry(person).SetModifiedProperty("SurName");
            }
            context.SaveChanges();
        }

    }

Это работает .. но я бы хотел сохранить изменения не сразу после того, как пользователь их изменит, а в конце, когда он нажмет БОЛЬШУЮ кнопку SAVE ALL, и тогда они пройдут через все элементы ObjectListView и обновят их. по мере необходимости в базе данных. Проблема в том, что я не могу обновить контекст и сделать это позже, так как контекст не будет использоваться тогда, но в конце при сохранении всего.

Так, каковы мои варианты? Мне было указано использовать INotifyPropertyChanged , но, как бы я ни смотрел на код, я не думаю, что это хорошо для такого типа ситуаций, или я просто не знаю, как его использовать.

Другой вариант состоял в том, чтобы фактически создать значение bool для каждого Column из базы данных, например

public partial class Person
{
    public bool NameChanged {get;set; }

    public bool SurnameChanged { get; set; }
}

И при сохранении я бы проверял, изменился ли bool, и если да, то сделайте магию ObjectStateManager в контексте до сохранения.

Есть ли другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Является ли использование POCO-объектов отслеживания изменений одним из вариантов для вас?

http://msdn.microsoft.com/en-us/library/dd456848.aspx

0 голосов
/ 17 февраля 2012

Я бы посоветовал использовать объект DataSource в вашем xaml и установить источник данных представления списка для привязки к объекту DataSource.Также используйте пейджер, (Вы можете получить его здесь: http://cid -51b2fdd068799d15.office.live.com / self.aspx / .Public / Samples% 5E_2010 / 20100929% 5E_DataPagerForWPF.zip), источник данных которого также будет связан собъект DataSource.Это позволит достичь 2 вещей:

  1. Пейджер будет запрашивать объект источника данных, гарантируя, что он загружает только x количество элементов данных (сущностей) за раз.Однако не обманывайте себя, что если у вас есть 5000000 сущностей, ваш контекст данных в конечном итоге сохранит все эти сущности в памяти после того, как пользователь перейдет на последнюю страницу.Эти объекты получают сборщик мусора.

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

Сказанное здесь - это два совета, которые облегчат вашу жизнь:

  1. Объекты по умолчанию реализуют INotifyPropertyChanged.

  2. Я верю, что пока контекст существует в том же пространстве памяти, что и изменяемые сущности, все, что вам нужно сделать, это вызвать SaveChanges () для контекста, чтобы зафиксировать изменения для всех измененных сущностей.ВЫ НЕ ДОЛЖНЫ ОТКЛЮЧАТЬ сущности, чтобы вы могли отобразить их, изменить их (хорошо, ваш пользователь изменяет их), затем повторно присоединить сущности к контексту и, наконец, уведомить контекст, что сущность изменилась.

...