当我尝试保存具有其他实体集合的实体时,我遇到了NHibernate的问题。
示例,Order和OrderLine。 OrderLine与订单与袋子相关联。它的级联设置为Delete-Orphan,当我为一个订单调用SaveOrUpdate时,我为其OrderLines调用SaveOrUpdate。
订单的SaveOrUpdate中发生异常,但仅当我的OrderLine集合不为空时才会发生。
在将级联设置为“delete-orphan”之前,我有“all-delete-orphan”,我认为我可以将OrderLine的SaveOrUpdate用于NHibernate。问题是每个OrderLine都有一个必须唯一的Number。如果我删除Number = 2的OrderLine并添加一个Number = 2的新OrderLine,当我再次尝试保存时会抛出异常,因为NHibernate会在删除旧孤儿之前插入并更新新的注册表。
因此,我认为保存我的Order实体(从集合中删除了Number = 2 OrderLine)将删除该OrderLine,然后,为当前OrderLines调用SaveOrUpdate将正确保存它们而没有唯一的键违规。
事实证明它没有,因为我在保存订单本身时遇到异常。
非常感谢任何帮助。 感谢
答案 0 :(得分:0)
我认为你已经遇到了NHibernate会话的操作顺序问题。 NHibernate总是首先插入并删除最后一个。想到的唯一解决方案是在删除和添加项目之间刷新会话。您的流程可能类似于:
var session = factory.OpenSession();
var tx = session.BeginTransaction();
order.Lines.Remove(line);
// Write out the SQL up to this point, inside the transaction
session.Flush();
order.Lines.Add(new OrderLine(...));
tx.Commit();
答案 1 :(得分:0)
感谢您的回答。
即使我创建了一个新订单,向集合中添加了新的OrderLines并为Order对象调用SaveOrUpdate,也会抛出“No collection snapshot ..”异常。它甚至不需要刷新或提交抛出异常。它位于SaveOrUpdate调用中。 它与OrderLine.Number的唯一约束无关。
无论如何,我提出的解决方案是:
我不喜欢这个解决方案..但它现在有效。
我想听到更多有关这方面的想法,以及人们经常如何使用NHibernate解决这个问题(使用OrderLines订购和使用cascade映射的包=“all-delete-orphan”)