我有一个服务层返回一组实体:
/// <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有点东西)。
答案 0 :(得分:4)
如果对象是在同一会话中加载的,则会话将跟踪已更改的对象并仅更新已更改的对象。但在您的情况下,对象与此会话无关。
您可以自己跟踪更改的对象并保存或更新已更改的对象。 NHibernate无法帮助你。
或者您可以尝试实现Session per perversvers模式,并将对象保留在多个请求的一个会话中。
作为旁注,您可以使用ISession.SaveOrUpdate(Object)方法而不是if语句。会议将为您完成;)。