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

C# NHibernate-KeyNotFoundException:字典中不存在给定的键,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,更新:我已修复此问题 我有下面的代码块,它最终应该会更新记录 if (session.Contains(entity)) { session.Evict(entity); } Session.execute(实体)上出现了哪些错误,其中包含KeyNotFoundException,并显示以下消息: 字典中不存在给定的键 我是不是误解了什么?我假设如果session.Contains(entity)为true,那么键应该存在,因此session.execute()应该按预期工作 堆栈跟踪

更新:我已修复此问题

我有下面的代码块,它最终应该会更新记录

if (session.Contains(entity))
{
    session.Evict(entity);
}
Session.execute(实体)上出现了哪些错误,其中包含KeyNotFoundException,并显示以下消息:

字典中不存在给定的键

我是不是误解了什么?我假设如果session.Contains(entity)为true,那么键应该存在,因此session.execute()应该按预期工作

堆栈跟踪如下所示:

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 

根据我的理解和猜测,如果您的
实体
的主键为
0
,则您的实体不需要被逐出,因为它尚未链接到数据存储


如果是这样,您可以检查
ID!=0
与会话.Contains一起使用。

这可能是NH如何识别实体的问题。它可以使用不同的方法在
包含
中查找实体,就像在
退出
中一样

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


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

结果表明Equals()方法比较不正确,它正在检查不属于复合键的对象上的附加属性的相等性

i、 e


其中DefaultEntry是一个属性。

请给它一个更有意义的标题。您有复合id吗?你实现了Equals吗?嗨,Stefan,我有一个由3个外键组成的复合ID,我实现了Equals()和GetHashCode(),嗨,我实际上在更新一条记录,所以ID应该已经存在了。我找到了答案,Equals()方法比较不正确,它正在检查不属于复合键的对象上附加属性的相等性。我会更新我的答案,但是我的名声不够好,所以我不得不再等5个小时:-(-谢谢你的帮助!我已经覆盖了equals()和gethashcode(),仍然出现了错误
return obj != null
                   && obj is InstanceVersion
                   && this.Instance.Id == ((InstanceVersion)obj).Instance.Id
                   && this.Version == ((InstanceVersion)obj).Version
                   && this.DefaultEntry == ((InstanceVersion)obj).DefaultEntry;