如何强制NHibernate不更新集合中的所有对象

如何强制NHibernate不更新集合中的所有对象,nhibernate,hibernate,orm,Nhibernate,Hibernate,Orm,如果我只更改集合中的一个元素,如何强制NHibernate不为该集合中的每个元素生成更新。这是: internal class Master { private int _id; public string Name { get; set; } public ISet<Slave> Slaves { get; set; } public Master() { Slaves = new HashedSet<Slave&g

如果我只更改集合中的一个元素,如何强制NHibernate不为该集合中的每个元素生成更新。这是:

internal class Master
{
    private int _id;

    public string Name { get; set; }
    public ISet<Slave> Slaves { get; set; }

    public Master()
    {
        Slaves = new HashedSet<Slave>();
    }
}

internal class Slave
{
    private int _id;

    public string Name { get; set; }
    public Master Master { get; set; }
}
DbManager.SaveObject中的代码只需打开新会话并使用SaveOrUpdate更新对象

如果我更改了master的Slaves集合中的一个元素,然后尝试更新master,那么NHibernate将生成SQL来更新Slaves集合中的所有元素。但我只需要更新一个元素


谢谢。

尝试使用access=“backfield”而不是access=“property”。

您可能会看到多余的多对一更新。将一个集合映射到多个集合时,必须选择哪一方是关系的所有者。在你的例子中,关系的双方都认为他们拥有它


您需要使用
inverse=“true”
向set元素添加属性。该指令告诉NHibernate不要从关系的那一端更新集合。

您正在重新保存一个临时集合,因为Master.Slaves仍然是原始集合

这不会在新的会话中发生

如果要在保存后更新同一会话中的某个实体,则应更新该实体的session.Refresh()。您的DBManager.SaveObject方法可以在保存后进行刷新

DbManager.SaveObject<T>( T entity )
{
    session.Save( entity );
    session.Refresh( entity );
}
DbManager.SaveObject(T实体)
{
session.Save(实体);
会话刷新(实体);
}

检查此项:和此项:在这种情况下,我应该显式保存已更改的集合元素,但我只想保存包含该元素的集合,并为仅已更改的元素获取单个UPDATE语句。能否显示加载实体、进行更改并保存的代码?听起来你可能正在重新连接一个分离的集合。在这种情况下,NHibernate无法跟踪更改,它会更新所有对象(默认情况下)。
Master m = new Master {Name = "Kenny"};

Slave s1 = new Slave { Name = "Cartman", Master = m};
m.Slaves.Add(s1);
Slave s2 = new Slave {Name = "Kyle", Master = m};
m.Slaves.Add(s2);
Slave s3 = new Slave {Name = "Stan", Master = m};
m.Slaves.Add(s3);

DbManager.SaveObject(m);

s1.Name = "Daisy";
DbManager.SaveObject(m);
DbManager.SaveObject<T>( T entity )
{
    session.Save( entity );
    session.Refresh( entity );
}