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。第二条路对你更有利(我想)。您甚至可以在集合中保留对已更改对象的引用(基本上模拟每个会话的会话,但不包含会话)。有很多方法可以做到这一点。。。