NHibernate跟踪实体和集合更改

时间:2009-07-17 08:32:52

标签: nhibernate collections

我有一个服务层返回一组实体:


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

在UI层调用此方法以获取IList集合并通过IBindingList将其绑定到UI:


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

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

然后UI更改IBindingList集合(添加,删除和编辑实体),因此在某些时候(保存之前),我们有一个包含已编辑,已删除和新实体的集合。如何以避免不必要更新的方式保存此集合(不更新未更改的实体)。当我执行以下操作时,将对集合中的所有项目运行插入/更新/删除语句:

UI上的


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 个答案:

答案 0 :(得分:4)

如果对象是在同一会话中加载的,则会话将跟踪已更改的对象并仅更新已更改的对象。但在您的情况下,对象与此会话无关。

您可以自己跟踪更改的对象并保存或更新已更改的对象。 NHibernate无法帮助你。

或者您可以尝试实现Session per perversvers模式,并将对象保留在多个请求的一个会话中。

作为旁注,您可以使用ISession.SaveOrUpdate(Object)方法而不是if语句。会议将为您完成;)。