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

Ale*_*s B 2 nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping

我有一个Parent类,有两个Child类列表

    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; }
    }
Run Code Online (Sandbox Code Playgroud)

映射是

        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);
        }
Run Code Online (Sandbox Code Playgroud)

每当我保存父对象时,我得到

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
Run Code Online (Sandbox Code Playgroud)

除了设置关系Inverse以避免额外更新之外,还有其他方法吗?

cre*_*mor 9

如果您有双向关联,则应将HasMany侧设置为反向,这是最常用的方法.

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

如果您不需要从子级到父级的引用,只需将其从类和映射中删除,以便您只拥有该集合.

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