【问题标题】:nhibernate mapping: delete collection, insert new collection with old IDsnhibernate 映射:删除集合,插入具有旧 ID 的新集合
【发布时间】:2011-02-02 22:00:09
【问题描述】:

我的问题类似于这个问题:(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 为集合执行“全部删除”/“全部插入”例程的最佳方法是什么?

【问题讨论】:

    标签: nhibernate mapping collections


    【解决方案1】:

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

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

    var mergedEntity = session.Merge(entityPasedFromClient)
    

    合并操作将从数据库中获取实体并将其与从客户端发送的实体进行比较并合并它们,这样 nhiberante 从数据库中获取的实体(并与会话相关联)被修改并稍后获取,返回合并的实体(这将与您传递合并操作的实体不同)。

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

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

    【讨论】:

    • session.Merge 就是医生说的!多谢!因为这个,我快疯了..哇..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多