nhibernate映射:删除集合,插入具有旧ID的新集合

nhibernate映射:删除集合,插入具有旧ID的新集合,nhibernate,mapping,collections,Nhibernate,Mapping,Collections,我的问题与此类似: 但我有一对多的联想: <set name="Fields" cascade="all-delete-orphan" lazy="false" inverse="true"> <key column="[TEMPLATE_ID]"></key> <one-to-many class="MyNamespace.Field, MyLibrary"/> </set> (我也试过使用) 此映射适用于模板对象。这一

我的问题与此类似:

但我有一对多的联想:

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

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

因此,当我为模板对象调用session.Update时,它工作得很好,几乎: 如果字段对象具有Id号,则调用更新sql请求;如果Id为0,则执行插入。但是,如果我从集合中删除字段对象,它对数据库没有影响。我发现,如果我也为这个字段对象调用session.Delete,一切都会正常,但由于客户机-服务器体系结构的原因,我不知道要删除什么

所以我决定从DB和call会话中删除所有集合元素。使用新集合更新。我有一个问题:nhibernate对Id非零的字段对象执行更新操作,但它们已从DB中删除

也许我应该使用其他Id生成器或smth。。
让nhibernate为集合执行“全部删除”/“全部插入”例程的最佳方法是什么?

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

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

var mergedEntity = session.Merge(entityPasedFromClient)
合并操作将从db中获取enity,并将其与从客户端发送的enity进行比较,然后将其合并,这样,修改nhiberante从db中获取的实体(并与会话关联),然后再获取,则返回合并的实体(这将不是与通过合并操作的实体相同的实例)

我不确定我是否理解你问题的最后一部分: “因此,我决定从DB和call会话中删除所有集合元素。使用新集合更新。我遇到了一个问题:nhibernate对Id非零的字段对象执行更新操作,但它们已从DB中删除!”


字段项是更新后删除的吗?

session.Merge正是医生说的!非常感谢!我为此非常生气..whow。。