我的问题类似于这个问题:(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执行“全部删除”/“插入所有”例程的最佳方法是什么?
答案 0 :(得分:2)
您正在更新的实体是否已与会话相关联? (即你加载实体并修改加载的实例)?
听起来你正试图告诉nhibernate更新一个分离的实体,在这种情况下,nhiberante无法知道在集合中添加/删除了哪些实体。在这种情况下,您可以使用Merge:
var mergedEntity = session.Merge(entityPasedFromClient)
合并操作将从db中获取enity,将其与从客户端发送的ennt进行比较并合并它们,这样就可以修改nhiberante从db获取的实体(并与会话相关联),稍后提取,将返回合并的实体(这将与您通过合并操作的实体不同)。
我不确定我理解你问题的最后部分: “所以我决定从数据库中删除所有集合元素,并使用新集合调用session.Update。我遇到了一个问题:nhibernate对具有非零Id的Field对象执行UPDATE操作,但它们是从DB中删除!“
字段项是否已更新,然后已删除?