如何确定nHibernate对象是否已更改

如何确定nHibernate对象是否已更改,nhibernate,Nhibernate,也许这是个愚蠢的问题,但我仍在试图绕着nHibernate转 就我使用该软件所知,nHibernate要求您做一些额外的处理来正确保存更改 假设我有一个对象X,它可以包含很多对象Y。我将创建一个X,它有两个Y,每个Y都有自己的属性。然后我决定要更新X。我要添加一个新的Y,并更改一个现有的Y 因此,我使用对象X的ID加载它。然后我迭代我要添加的Y,将它们添加到X中,并使用update语句保存该批次 如果您这样做,您会发现“旧”Y在数据库中成为孤儿。当我想到这一点时,这正是我所期望的——毕竟,我还没

也许这是个愚蠢的问题,但我仍在试图绕着nHibernate转

就我使用该软件所知,nHibernate要求您做一些额外的处理来正确保存更改

假设我有一个对象X,它可以包含很多对象Y。我将创建一个X,它有两个Y,每个Y都有自己的属性。然后我决定要更新X。我要添加一个新的Y,并更改一个现有的Y

因此,我使用对象X的ID加载它。然后我迭代我要添加的Y,将它们添加到X中,并使用update语句保存该批次

如果您这样做,您会发现“旧”Y在数据库中成为孤儿。当我想到这一点时,这正是我所期望的——毕竟,我还没有摆脱那些对象,我只是创建了一些新的对象

所以有两种方法来看待这个问题。要么我应该删除所有Y数据,然后重新创建它,要么我应该能够向nHibernate表明我所做的是一个更改,应该更新现有对象,而不是创建新对象。问题是,我不确定哪种方法是“正确”的,或者如何最好地做到这一点——前者似乎效率极低,而后者意味着设置大量“已更改”的标志和非常复杂的代码

所以我很确定,一定有一个更简单的解决办法,而我的愚蠢却忽略了。有人能告诉我在nHibernate最好的方法和如何最好地处理它吗。。。如果这个问题有任何意义的话:)

干杯,
Matt

您可能有映射或使用问题

正确配置后,您的使用情况应如下所示:

using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
    var x = session.Get<X>(theId);
    x.Ys[0].SomeProperty = theNewValue;
    x.Ys.Add(theNewY);
    tx.Commit();
}
使用(var session=sessionFactory.OpenSession())
使用(var tx=session.BeginTransaction())
{
var x=session.Get(theId);
x、 Ys[0]。SomeProperty=新值;
x、 Ys.添加(新的);
tx.Commit();
}
您应该发布更多关于实际类、映射和用法的详细信息

此外,我建议您阅读完整的文档:。只要几个小时,就可以省去你很多天的沮丧