0

结构:TypeA 有 TypeB 的集合,TypeB 有 TypeC 的集合。

TypeB 和 TypeC 是多态的。

TypeA 映射

HasMany<TypeB>(t => t.TypeBList).CascadeAll().Inverse()..

B型映射

HasManyToMany<TypeC>(t => t.TypeCList).Casecade.All().Inverse()..

TypeC 映射

HasManyToMany<TypeB>(t => t.TypeBList).Casecade.None()...

TypeB 有一个方法

Add(TypeC typec) { typec.TypeBList.Add(this); TypeBList.Add(typec); }

我需要向 typeb 集合添加一个新的 typec,但我想通过调用 repo.Save(typeA) 来保存,但我遇到了共享集合问题,因为 TypeB 在 TypeA 和 TypeC 中都存在。

var typec = new TypeC { TypeBList = typea.TypeBList, .... }
typea.TypeBList[0].Add(typec);
repo.save(typea);

这不会通过保存 typea 来工作,我是否被迫获得 typeb 并在那里进行更改?

4

1 回答 1

0

对象上的集合通常根本不应该共享,而且大多数时候,尤其是在使用 NHibernate 时,您甚至不应该更改集合实例。最好复制内容。

obj1.ListA.Clear();

foreach(var item in obj2.ListA)
    obj1.ListA.Add(Item);

更新:为什么?

因为 NHibernate 用自己的集合类替换集合实例以启用延迟加载和更改跟踪。

于 2012-06-29T08:25:49.173 回答