3

我有一个包含两个子类列表的父类

    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以避免额外更新之外,还有其他方法吗?

4

2 回答 2

10

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

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

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

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

于 2011-11-07T11:55:06.260 回答
1

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

为什么指定逆属性对您来说是个问题?

于 2011-11-07T11:21:35.447 回答