![](/img/trans.png)
[英]KeyNotFoundException : The given key was not present in the dictionary
[英]NHibernate - KeyNotFoundException: The given key was not present in the dictionary
更新:我已解决此问题
我有以下代码块,最终应该更新记录
if (session.Contains(entity))
{
session.Evict(entity);
}
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
事实证明,Equals()方法比较错误,它检查对象上的附加属性的相等性,该属性不是复合键的一部分。
即
return obj != null
&& obj is InstanceVersion
&& this.Instance.Id == ((InstanceVersion)obj).Instance.Id
&& this.Version == ((InstanceVersion)obj).Version
&& this.DefaultEntry == ((InstanceVersion)obj).DefaultEntry;
DefaultEntry是一个属性。
这可能是NH如何识别实体的问题。 它可以使用不同的方法在Evict
查找Contains
中的实体。
如果使用复合ID,它将使用实体本身的实例作为键类型,除非您实现了另一个表示复合ID的类。 Equals
和GetHashCode
对于比较复合键也很重要。 它需要比较密钥的属性。
要找到实际原因,您可以调试NH代码,或者至少查看堆栈跟踪(将其粘贴到您的问题中)。
根据我的理解和猜测,如果您的entity
的PK为0
您的实体不需要被驱逐,因为尚未链接到数据存储。
如果是这样,您可以使用session.Contains检查&&中的ID != 0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.