MichaelS MichaelS - 1 year ago 284
C# Question

NHibernate - KeyNotFoundException: The given key was not present in the dictionary

Update: I have fixed this issue

I have the following block of code which should ultimately update a record

if (session.Contains(entity))

which errors on Session.Evict(entity) with a KeyNotFoundException, and the following message:

The given key was not present in the dictionary.

Am I misunderstanding something? I assume if session.Contains(entity) is true, then the key should exist and therefore session.Evict() should work as expected?

Stack trace is as follows:

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

Answer Source

It turns out that the Equals() method was comparing incorrectly, it was checking the equality of an additional property on the object which was not part of the composite key.


return obj != null
                   && obj is InstanceVersion
                   && this.Instance.Id == ((InstanceVersion)obj).Instance.Id
                   && this.Version == ((InstanceVersion)obj).Version
                   && this.DefaultEntry == ((InstanceVersion)obj).DefaultEntry;

Where DefaultEntry is a property .

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download