Nhibernate有很多插入生成额外的更新(没有反向)

时间:2011-11-07 11:18:58

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有一个包含两个Child类列表的Parent类

    public class Parent
    {
        ...

        public virtual ICollection<Foo> Foo{ get; set; }

        public virtual ICollection<Bae> Bar{ get; set; }
    }

    public class Foo
    {
        ...

        public virtual Parent Parent{ get; set; }
    }

    public class Bar
    {
        ...

        public virtual Parent Parent{ get; set; }
    }

映射是

        public ParentMap()
        {
            ...

            HasMany(m => m.Foo).AsSet().Cascade.All();
            HasMany(m => m.Bar).AsSet().Cascade.All();
        }

        public FooMap()
        {
            ...

            References(m => m.Parent);
        }

        public BarMap()
        {
            ...

            References(m => m.Parent);
        }

每当我保存父对象时,我都会

INSERT Parent ...
INSERT Foo with Parent_id set to NULL
INSERT Bar with Parent_id set to NULL
UPDATE Foo set Parent_id to Parent id
UPDATE Bar set Parent_id to Parent id

分开是否可以将关系设置为Inverse以避免额外更新?

2 个答案:

答案 0 :(得分:9)

如果您有双向联想,将HasMany方面设置为反向,这是最常用的方法。

另一种可能性是将父引用设置为Not.Insert().Not.Update(),然后对于插入/更新将完全忽略父属性。

如果您不需要从子级到父级的引用,只需将其从类和映射中删除,这样您就只有该集合。

对于第二种和第三种方式,您可以在HasMany上另外设置Not.KeyNullable(),这可以确保NHibernate插入已设置父ID的新行,并避免使用额外的更新语句(此功能需要NHibernate 3.2。 0)。

答案 1 :(得分:1)

AFAIK,不是。 通过设置inverse属性,可以指定关联的所有者。

为什么指定反向属性是个问题?