NHibernate跟踪实体和集合更改

NHibernate跟踪实体和集合更改,nhibernate,collections,Nhibernate,Collections,我有一个返回实体集合的服务层: /// <summary> /// Returns list of all existing accounts. /// </summary> IList<Account> GetAllAccounts(); /// ///返回所有现有帐户的列表。 /// IList GetAllAccounts(); 这在UI层上被调用,以获取IList集合并通过IBindingList将其绑定到UI: public Bindi

我有一个返回实体集合的服务层:


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

/// 
///返回所有现有帐户的列表。
/// 
IList 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());
}

公共绑定列表帐户
{
得到;
私人设置;
}
公共帐户()
{
var service=IoC.Resolve();
Accounts=新绑定列表(service.GetAllAccounts());
}
然后UI会更改IBindingList集合的属性(添加、删除和编辑实体),因此在某个时刻(保存之前),我们会有一个已编辑、删除和新建实体的集合。如何保存此集合以避免不必要的更新(不要更新未更改的实体)。执行以下操作时,将对集合中的所有项运行Insert/Update/Delete语句:

在用户界面上:


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

公共作废保存()
{
var accountService=IoC.Resolve();
账户服务。更新(账户);
}

在服务层上:


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();
    }            
}

公共作废更新(IList帐户)
{
if(accounts==null | | accounts.Count==0)
返回;
使用(UnitOfWork.Start())
使用(var session=UnitOfWork.CurrentSession)
使用(var tx=session.BeginTransaction())
{
foreach(账户中的var acc)
{
如果(acc.AccountId==0)
{
会议.保存(行政协调会);
}
其他的
{
最新情况(行政协调会);
}
}
tx.Commit();
}            
}

请注意,实体是一些POCO类。是否有任何方法可以知道集合是否有更改,或者有一种简单的方法可以找到实体是否脏(HasChanges或IsDirty之类的东西)。

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

您可以自己跟踪更改的对象,并保存或更新更改的对象。NHibernate在这方面帮不了你

或者,您可以尝试按照会话模式实现会话,并在多个请求上将对象保持在一个会话中


作为补充说明,您可以使用ISession.SaveOrUpdate(Object)方法而不是if语句。会话将为您完成此操作;)

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

您可以自己跟踪更改的对象,并保存或更新更改的对象。NHibernate在这方面帮不了你

或者,您可以尝试按照会话模式实现会话,并在多个请求上将对象保持在一个会话中


作为补充说明,您可以使用ISession.SaveOrUpdate(Object)方法而不是if语句。会话将为您完成此操作;)

这似乎是一种更不连贯的方式…所以每次对话一次是不行的。当通过线路传递NH实体(例如WCF)时,我们如何处理跟踪更改?这和IMHO的情况是一样的。几乎没有跟踪变化的方法。您可以包装对象并添加一个字段,表示实体的更改。或者,您可以在集合中保留已更改对象的ID。第二条路对你更有利(我想)。您甚至可以在集合中保留对已更改对象的引用(基本上模拟每个会话的会话,但不包含会话)。有很多方法可以做到这一点…这似乎是一种更不连贯的方法…所以每次对话一次会话是不行的。当通过线路传递NH实体(例如WCF)时,我们如何处理跟踪更改?这和IMHO的情况是一样的。几乎没有跟踪变化的方法。您可以包装对象并添加一个字段,表示实体的更改。或者,您可以在集合中保留已更改对象的ID。第二条路对你更有利(我想)。您甚至可以在集合中保留对已更改对象的引用(基本上模拟每个会话的会话,但不包含会话)。有很多方法可以做到这一点。。。