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

标签 nhibernate hibernate orm

如果仅更改集合中的每个元素,如何强制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/

相关文章:

c# - Fluent NHibernate 不创建 WHERE 子句的 IN 部分

php - 跨数据库连接学说

python - Django ORM 和工作单元

sql - ORM 有什么了不起?

c# - List<int> 需要很长时间才能使用 Nhibernate Criteria 进行实例化

nhibernate - fluent nhibernate r1.0 fluent 映射禁用延迟加载

nhibernate - 使用 log4net 清空 NHibernate 日志文件

java - 加入相关实体时可以指定基于日期的分区键吗?

java - 清除关联子项列表后的 session 更新不会删除它们

java - Spring ReadOnly Transaction with Propagation.SUPPORTS with WebSphere 和 Oracle