有人能帮我吗?我有一种休眠的情况,我从视图中检索对象,并进行手动映射将其转换为对象,然后尝试将该对象附加回会话。为此,我使用锁。它工作得很好,但在某些情况下,我检索了两次对象,锁定发生了两次,并给出了相同密钥已经在会话中的错误。是否有其他方法将对象附加到会话?注意:我的代码使用的是nhibernate v1,因为它已经很旧了。
NHibernate会话必须确保数据库中的唯一行在其内部是唯一的,这意味着
- 如果在两个变量中有相同类的相同对象,并使用object。ReferenceEquals,然后返回true,另请参阅https://learn.microsoft.com/en-us/dotnet/api/system.object.referenceequals?view=net-6.0.如果您不确定Equals VS ReferenceEquals,则应查找引用类型与值类型
- 优化(如果可能的话,也就是避免(访问数据库,这意味着如果可能,它将通过内存中的键来查找对象
因此,您100%坚持每个键/会话/类组合有一个对象。您必须更改从视图加载/转换数据的代码。你必须用给定的键查找已经在内存中的对象,并从内存中返回该对象,而不是创建一个新对象,如果你已经找到了的话。你必须在两个选项之间决定如何处理视图中的新数据:
- 丢弃它!你的内存中已经有了这些数据。(我更喜欢这样。(
- 更新内存中的对象,映射到对象而不是新对象中。(请注意,这将"覆盖"所有已经在内存中进行但尚未提交到数据库的更改,而使用NHibernate,您永远无法确定是否存在。(
如何在NHibernate会话中通过对象的类和键来查找对象。。。我不知道从记忆中,但我相信你会很快发现。
问候
Juy Juka