NHibernate:向延迟加载的多对多关系添加实体

NHibernate:向延迟加载的多对多关系添加实体,nhibernate,many-to-many,lazy-loading,Nhibernate,Many To Many,Lazy Loading,我们有一个实体,其多对多集合映射为延迟加载包。当我们加载实体时,集合没有加载-太好了。现在我们要向该集合添加一个新实体。一旦我们这样做,收藏就被加载了 如何在不加载整个集合(集合很大)的情况下添加新实体?此行为的原因是在向集合添加()新项时引用了该集合。此引用触发延迟加载 我发现在NHibernate中最好避免显式多对多映射。我通常使用两个一对多的关联到第三个实体,这就像一个链接表。确保将关系的多个方面设置为reverse=“true”。然后,您可以直接执行: session.Save(新链接实

我们有一个实体,其多对多集合映射为延迟加载包。当我们加载实体时,集合没有加载-太好了。现在我们要向该集合添加一个新实体。一旦我们这样做,收藏就被加载了


如何在不加载整个集合(集合很大)的情况下添加新实体?

此行为的原因是在向集合添加()新项时引用了该集合。此引用触发延迟加载

我发现在NHibernate中最好避免显式多对多映射。我通常使用两个一对多的关联到第三个实体,这就像一个链接表。确保将关系的多个方面设置为reverse=“true”。然后,您可以直接执行:

session.Save(新链接实体(leftSideInstanceOrProxy,rightSideInstanceOrProxy);


另一个好处是,通常会有关于要保存的关系的信息,这些信息也可以放入新实体中。

我也遇到了同样的问题

您只需创建中间实体并执行两个一对多关系

如果检查它生成的语句以更新多对多关系,则无论如何都不会使用它。 当您向多对多关系中添加一个新项时,首先加载的关系(我认为这会生成一个select语句),然后更新该关系并进行提交。发生以下情况:

对数组中的每个对象执行Delete(可能是一个Delete语句或N个Delete语句,我不记得了)

所有对象都将重新插入数据库(N条insert语句+新语句)

如果您对多对多关系进行了大量更新,则多对多映射不适合您。您可以在不更改或不经常更改的对象上使用多对多(因为所有的删除和重新插入操作)

您应该创建3个对象(比如User、Post、Vote,这是一个User\u Post中间表)。
为所有这些表创建主键(甚至为USER_POST)。创建代理键,并将USER_ID、POST_ID约束为USER_POST表的uniqe。将其映射为普通的一对多、多对一(父-子、子-父)关系,仅此而已。

如果不想更改域模型,可以直接执行SQL来更新m-m链接表(使用Nhibernate查询或执行参数化存储过程)


另外,请注意,您将无法使用
Add()
操作(否则NH将自动触发延迟加载)相反,请考虑在存储库类中调用一个适当命名的方法。

当没有额外的信息需要时,这种方法使您的域模型持久性依赖,是的,我不想为这个模型添加一个非业务相关的类。但是,我已经做了一个尖峰,我不能用其他方法来做。我认为NHIBEN是正确的。ate不支持此功能?如果支持,有人知道为什么不支持吗?二级缓存如何?