NHibernate - KeyNotFoundException: данный ключ не присутствовал в словаре - PullRequest
11 голосов
/ 30 августа 2011

Обновление: я исправил эту проблему

У меня есть следующий блок кода, который должен в конечном итоге обновить запись

if (session.Contains(entity))
{
    session.Evict(entity);
}

какие ошибки в Session.Evict (entity) с KeyNotFoundException и следующее сообщение:

Указанный ключ отсутствует в словаре.

Я что-то неправильно понимаю? Я предполагаю, что если session.Contains (entity) имеет значение true, тогда ключ должен существовать и, следовательно, 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 

Ответы [ 3 ]

6 голосов
/ 31 августа 2011

Оказывается, что метод 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 является свойством.

5 голосов
/ 30 августа 2011

Это может быть проблемой того, как NH идентифицирует сущность.Он может использовать другой метод для нахождения сущности в Contains, как в Evict.

Если вы используете составной идентификатор, он использует экземпляры самой сущности в качестве типа ключа, если вы не реализовали другой класс, который представляет составной идентификатор.Equals и GetHashCode также важны для сравнения составного ключа.Нужно сравнить свойства ключа.

Чтобы найти фактическую причину, вы можете отладить код NH или, по крайней мере, взглянуть на трассировку стека (вставьте ее в свой вопрос).

0 голосов
/ 30 августа 2011

Насколько я понимаю, если PK вашего entity равен 0, ваша сущность не нуждается в выселении, поскольку еще не связана с хранилищем данных.

Если это так, вы можете проверить ID != 0 в && с сеансом. Содержит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...