gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:17:14 26 4
gpt4 key购买 nike

如果仅更改集合中的每个元素,如何强制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中的代码只是打开新 session 并使用SaveOrUpdate来更新对象。

如果我从master的Slaves集合中更改元素之一,然后尝试更新master,则NHibernate会生成SQL以更新Slaves集合中的所有元素。但是我只需要更新一个元素。

谢谢。

最佳答案

您可能会看到多余的多对一更新。在映射一对多集合时,必须选择关系的所有者。在您的示例中,关系的双方都认为自己拥有它!

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

关于nhibernate - 如何强制NHibernate不更新集合中的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2311849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com