如何强制NHibernate不更新集合中的所有对象
如果我只更改集合中的一个元素,如何强制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
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 );
}