nhibernate mapping:删除集合,使用旧ID插入新集合

时间:2010-03-31 12:33:19

标签: nhibernate mapping collections

我的问题类似于这个问题:(link)

但我有一对多的关联:

<set name="Fields" cascade="all-delete-orphan" lazy="false" inverse="true">
  <key column="[TEMPLATE_ID]"></key>
  <one-to-many class="MyNamespace.Field, MyLibrary"/>
</set>

(我也试过用) 此映射适用于模板对象。这个和 Field 对象的ID生成器设置为 identity

所以当我为Template对象调用session.Update时,它工作正常,好吧,差不多: 如果Field对象具有Id编号,则调用UPDATE sql请求,如果Id为0,则执行INSERT。但是如果我从集合中删除一个Field对象,它对数据库没有任何影响。我发现如果我也为这个Field对象调用session.Delete,一切都会好的,但由于客户端 - 服务器架构,我不知道要删除什么。

所以我决定从数据库中删除所有集合元素,并使用新集合调用session.Update。我有一个问题:nhibernate对具有非零Id的Field对象执行UPDATE操作,但它们将从DB中删除!

也许我应该使用其他一些Id生成器或smth .. 使nhibernate执行“全部删除”/“插入所有”例程的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您正在更新的实体是否已与会话相关联? (即你加载实体并修改加载的实例)?

听起来你正试图告诉nhibernate更新一个分离的实体,在这种情况下,nhiberante无法知道在集合中添加/删除了哪些实体。在这种情况下,您可以使用Merge:

var mergedEntity = session.Merge(entityPasedFromClient)

合并操作将从db中获取enity,将其与从客户端发送的ennt进行比较并合并它们,这样就可以修改nhiberante从db获取的实体(并与会话相关联),稍后提取,将返回合并的实体(这将与您通过合并操作的实体不同)。

我不确定我理解你问题的最后部分: “所以我决定从数据库中删除所有集合元素,并使用新集合调用session.Update。我遇到了一个问题:nhibernate对具有非零Id的Field对象执行UPDATE操作,但它们是从DB中删除!“

字段项是否已更新,然后已删除?