2012-03-06 104 views
0

我使用(流利)nhibernate,我遇到了一个小问题。我的数据模型是有一个用户对象与一个到另一个对象的一对多链接(我将它称为Obj1)。 Obj1有一个在我的应用程序外部的主键。虽然我可以将其更改为拥有自己的主键并因此允许重复,但会在稍后导致更多问题。Nhibernate数据对象有对象添加,删除,然后添加

用户可以随时在他们的个人资料中添加和删除Obj1,并在执行每个操作时立即调用数据层。问题是,如果用户添加一个Obj1,删除它,然后再添加它,那么nhibernate会给我一个NonUniqueObjectException。

这是因为添加的第一个Obj1似乎仍然处于nhibernate会话中。似乎有几种解决方案:

  1. 清除会话并在发生更新时重新加载用户obj。
  2. 从这里开始:nhibernate : a different object with the same identifier value was already associated with the session: 2, of entity: - 在每次更新后,从会话缓存中逐出用户对象。
  3. 重写允许用户管理Obj1的屏幕,以便它只在离开屏幕时调用数据层。

1和2更容易,但两者都显得有些黑客。 3似乎是“正确”的解决方案,但意味着我可能在稍后更难解决的领域遇到同样的问题。

所以问题是,哪个最好,为什么?由于某些原因,这些解决方案是否真的很糟糕? (例如,尝试对nhibernate缓存进行微操纵看起来对我来说似乎是一个不好的主意。)

注意:奇怪的是,通过编写这个我从完全不确定到完全相信3是最好的方法走。我仍然有兴趣听到其他观点。

回答

0

我在存储库中添加了一个单元测试来重现这个问题,令我惊讶的是,它工作正常。 几分钟后,我发现真正的问题 - 我没有坚持删除Obj1到数据层。一旦我这样做,一切运作良好。

哦,至少它为我节省了很多工作。