NHibernate异常:没有用于孤立删除的集合快照

时间:2009-06-08 14:05:58

标签: nhibernate

当我尝试保存具有其他实体集合的实体时,我遇到了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将正确保存它们而没有唯一的键违规。

事实证明它没有,因为我在保存订单本身时遇到异常。

非常感谢任何帮助。 感谢

2 个答案:

答案 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的唯一约束无关。

无论如何,我提出的解决方案是:

  • 使用cascade =“all-delete-orphan”映射OrderLines包(利用OrderLines保存/更新/删除)
  • 删除数据库中OrderLine.Number的唯一约束。
  • 在我的OrderRepository类的SaveOrUpdate方法中使用断言(我正在使用SharpArchitecture)以确保我永远不会保存具有两个或更多具有相同编号的订单行的订单。

我不喜欢这个解决方案..但它现在有效。

我想听到更多有关这方面的想法,以及人们经常如何使用NHibernate解决这个问题(使用OrderLines订购和使用cascade映射的包=“all-delete-orphan”)