NHibernate отслеживания сущности и коллекции изменений - PullRequest
1 голос
/ 17 июля 2009

У меня есть сервисный уровень, возвращающий коллекцию сущностей:


/// <summary>
/// Returns list of all existing accounts.
/// </summary>
IList<Account> GetAllAccounts();

Это вызывается на уровне пользовательского интерфейса, чтобы получить коллекцию IList и связать ее с пользовательским интерфейсом через IBindingList:


public BindingList<Account> Accounts
{
   get; 
   private set;
}

public void LoadAccounts()
{
   var service = IoC.Resolve<IAccountService>();
   Accounts = new BindingList<Account>(service.GetAllAccounts());
}

Затем пользовательский интерфейс изменяет коллекцию IBindingList (добавление, удаление и редактирование сущностей), поэтому в какой-то момент (перед сохранением) у нас есть коллекция, которая редактировала, удаляла и новые сущности. Как я могу сохранить эту коллекцию таким образом, чтобы избежать ненужных обновлений (не обновлять сущности, которые не были изменены). Когда я делаю следующее, оператор ВСТАВИТЬ / Обновить / Удалить запускается для ВСЕХ элементов в коллекции:

в интерфейсе пользователя:

<code>
public void Save()
{
   var accountService = IoC.Resolve();
   accountService.Update(Accounts);
}

на уровне обслуживания:


public void Update(IList<Account> accounts)
{
    if (accounts == null || accounts.Count == 0)
        return;

    using (UnitOfWork.Start())
    using (var session = UnitOfWork.CurrentSession)
    using (var tx = session.BeginTransaction())
    {
        foreach (var acc in accounts)
        {
            if (acc.AccountId == 0)
            {
                session.Save(acc);
            }
            else
            {
                session.Update(acc);
            }
        }

        tx.Commit();
    }            
}

Обратите внимание, что сущностями являются некоторые классы POCO. Есть ли какой-нибудь способ узнать, есть ли в коллекции изменения, или простой способ определить, является ли объект грязным (вроде HasChanges или IsDirty).

1 Ответ

4 голосов
/ 17 июля 2009

Если объекты были загружены в одном сеансе, тогда сеанс отслеживает измененные объекты и обновляет только измененные. Но в вашем случае объекты не связаны с этим сеансом.

Вы можете самостоятельно отслеживать измененные объекты и сохранять или обновлять измененные. NHibernate не может помочь вам там.

Или вы можете попытаться реализовать шаблон «Сеанс для беседы» и сохранить объекты в одном сеансе по нескольким запросам.

В качестве примечания вы можете использовать метод ISession.SaveOrUpdate (Object) вместо оператора if. Сессия сделает это за вас;).

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