Nhibernate许多共享收集问题

时间:2012-06-26 00:43:51

标签: c# nhibernate fluent-nhibernate

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

TypeB和TypeC很多。

TypeA映射

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

TypeB映射

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)来保存,但是我收到了共享集合问题,因为TypeA和TypeC都存在TypeB。

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

通过保存typea这不起作用,我是否被迫获得一个typeb并在那里进行更改?

1 个答案:

答案 0 :(得分:0)

对象上的集合通常不应该在大多数时间共享,特别是在使用NHibernate时,您甚至不应该更改集合实例。更好地复制内容。

obj1.ListA.Clear();

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

更新:为什么?

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