NHibernate - KeyNotFoundException:给定的键在字典中不存在

Mic*_*elS 11 c# nhibernate fluent-nhibernate

更新:我已解决此问题

我有以下代码块,最终应该更新记录

if (session.Contains(entity))
{
    session.Evict(entity);
}
Run Code Online (Sandbox Code Playgroud)

Session.Evict(实体)上有哪些错误,带有KeyNotFoundException,以及以下消息:

给定的密​​钥不在字典中.

我误会了什么吗?我假设如果session.Contains(entity)为true,那么key应该存在,因此session.Evict()应该按预期工作?

堆栈跟踪如下:

System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary.

at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at NHibernate.Engine.StatefulPersistenceContext.RemoveEntity(EntityKey key)
at NHibernate.Event.Default.DefaultEvictEventListener.OnEvict(EvictEvent event)
at NHibernate.Impl.SessionImpl.FireEvict(EvictEvent evictEvent)
at NHibernate.Impl.SessionImpl.Evict(Object obj)
at Core.Repository.NHibernate.Repository.NoIdRepository`1.Update(T entity) in NoIdRepository.cs: line 26
at Core.Tests.Repository.NHibernate.Repository.TestInstanceVersionRepository.Test_Saving_Data() in TestInstanceVersionRepository.cs: line 63 
Run Code Online (Sandbox Code Playgroud)

Mic*_*elS 6

事实证明,Equals()方法比较错误,它检查对象上的附加属性的相等性,该属性不是复合键的一部分.

return obj != null
                   && obj is InstanceVersion
                   && this.Instance.Id == ((InstanceVersion)obj).Instance.Id
                   && this.Version == ((InstanceVersion)obj).Version
                   && this.DefaultEntry == ((InstanceVersion)obj).DefaultEntry;
Run Code Online (Sandbox Code Playgroud)

DefaultEntry是一个属性.


Ste*_*ger 5

这可能是NH如何识别实体的问题.它可以使用不同的方法来查找实体ContainsEvict.

如果使用复合ID,它将使用实体本身的实例作为键类型,除非您实现了另一个表示复合ID的类.Equals并且GetHashCode比较复合键也很重要.它需要比较密钥的属性.

要找到实际原因,您可以调试NH代码,或者至少查看堆栈跟踪(将其粘贴到您的问题中).

  • 我找到答案,Equals()方法比较错误,它检查对象上的附加属性的相等性,该属性不是复合键的一部分.我会用我的答案更新,但我没有足够的声誉所以我必须等待另外5个小时:-( - 感谢你的帮助! (3认同)