Обновление DevExpress XPO XPCollection Изменения

У меня возникла проблема с обновлением данных в XPCollection после внесения некоторых изменений в базу данных с помощью UnitOfWork.

У меня есть WinForm с XPCollection.

XPCollection использует XpoDefault.Session.

Я делаю некоторые изменения через UnitOfWork:

using (UnitOfWork uow = new UnitOfWork())
    {
    var photos = new XPCollection<Photo>(uow);
    photos[0].Date = DateTime.Now;
    uow.CommitTransaction();

    }

Чтобы получить исходную XPCollection для обновления изменений, я пробовал следующее:

foreach (Photo photo in myXPCollection)
{
XpoDefault.Session.Reload(photo);
}

foreach (Photo photo in myXPCollection)
{
photo.Reload();           
}

myXPCollection.Reload()

Ни один из методов не работает. Изменения не отражаются в исходной XPCollection.

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

Как перенести изменения, сделанные с помощью UnitOfWork, в другую сессию?


person SharpAffair    schedule 09.04.2013    source источник


Ответы (1)


Вы сказали:

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

Это именно то, что вы должны сделать. Создавайте новый UnitOfWork каждый раз, когда вам нужны обновленные данные. Создание экземпляра UnitOfWork очень дешево с точки зрения производительности. Если у вас есть большая коллекция объектов Photo, вам следует повысить производительность, загрузив только те объекты, которые вам нужны, указав параметр Criteria в конструкторе XPCollection<Photo>.

Когда вы запускаете Reload(), он ничего не извлекает из базы данных: он отбрасывает любые изменения и перезагружает объект из карты идентификации сеанса. Вы можете прочитать эту статью и эту проблему Центра поддержки для получения дополнительной информации.

Кстати, Центр поддержки DevExpress — лучшее место, где можно задать вопросы DevExpress.

person shamp00    schedule 09.04.2013
comment
Создание нового сеанса каждый раз кажется мне нелогичным. Нет ли способа просто принудительно обновить существующую XPCollection/Session из источника данных? - person SharpAffair; 09.04.2013
comment
Вам не нужно обновлять источник данных. О, я вижу, вы используете неправильный коммит. Измените его на uow.CommitChanges(). - person shamp00; 09.04.2013
comment
CommitTransaction() предназначен для транзакций. - person shamp00; 09.04.2013
comment
Хорошая находка. Но изменения по-прежнему недоступны в исходном сеансе, даже после CommitChanges в UnitOfWork. - person SharpAffair; 09.04.2013
comment
Вы делаете что-то не так. Вот рабочий пример программы. - person shamp00; 09.04.2013