Как заставить NHibernate не генерировать UPDATE для каждого элемента в коллекции, если я изменяю только один элемент из этой коллекции. Вот оно:
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; }
}
Отображения:
<class name="nHibernateTutorials.Slave, nHibernateTutorials" lazy="false">
<id access="field" name="_id" column="id">
<generator class="native"/>
</id>
<property access="property" name="Name" column="name"/>
<many-to-one access="property" name="Master" column="master"/>
</class>
<class name="nHibernateTutorials.Master, nHibernateTutorials" lazy="false">
<id access="field" name="_id" column="id">
<generator class="native"/>
</id>
<property access="property" name="Name" column="name"/>
<set access="property" name="Slaves" cascade="save-update">
<key column="master"/>
<one-to-many class="nHibernateTutorials.Slave, nHibernateTutorials"/>
</set>
</class>
Код, который обновляет элемент коллекции:
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 просто открывает новый сеанс и использует SaveOrUpdate для обновления объекта.
Если я изменяю один из элементов из основной коллекции Slaves и затем пытаюсь обновить master, NHibernate генерирует SQL для обновления всех элементов в коллекции Slaves. Но мне нужно обновить только один элемент.
Спасибо.