«Указанный ключ отсутствует в словаре» nHibernate C # - PullRequest
4 голосов
/ 14 марта 2011

Я довольно новичок в nHibernate. Я установил следующее взаимно-однозначное сопоставление между двумя таблицами «Пользователь» и «Пользовательский профиль».

User.hbm.xml:

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"           namespace="Core.Domain.Model" assembly="Core">

  <class name="User" table="Users" dynamic-update="true" lazy="false">
    <cache usage="read-write"/>
    <id name="UserId" column="UserId" type="guid">
    </id>
    <one-to-one name="UserProfile" class="UserProfile"/>
  </class>
</hibernate-mapping>

UserProfile.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Core.Domain.Model" assembly="Core">
<class name="UserProfile" table="UserProfiles" dynamic-update="true" lazy="false">
    <cache usage="read-write"/>
    <id name="UserProfileId" column="UserProfileId" type="int">
      <generator class="native"/>
    </id>
    <property name="Description" length="100"/>
  <many-to-one name="User" unique="true" column="UserId"/>
  </class>
</hibernate-mapping> 

Мои POCO для вышеуказанных отображений:

public class User
    {
        public virtual Guid UserId { get; set; }
        public virtual UserProfile UserProfile { get; set; }

    }

public class UserProfile
    {
        public virtual int UserProfileId { get; set; }
        public virtual User User { get; set; }
    }

Теперь, когда я пытаюсь сохранить свой объект «Пользователь», я получаю исключение: « Указанный ключ отсутствует в словаре » в следующей строке:

using (ISession session = SessionFactory.OpenSession())

Кто-нибудь знает, что здесь может происходить?

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Я скопировал ваши сопоставления hbm и ваши классы в мой тестовый проект. Я получил ошибку при создании SessionFactory. Есть ли шанс, что вы создаете SessionFactory при первом обращении к нему в своем заявлении об использовании? Если так, то это, мы надеемся, решит проблему:

Я исправил это, добавив

public virtual String Description { get; set; }

к классу UserProfile. Если у вас есть это в вашем коде, и вы просто забыли об этом во время копирования и вставки, я постараюсь продолжить расследование.

Edit:

Другой возможный источник этой ошибки - как найдено здесь :

Убедитесь, что все ваши файлы .hbm.xml являются встроенными ресурсами.

Если это по-прежнему не помогает, не могли бы вы опубликовать StackTrace об исключении?

0 голосов
/ 14 марта 2017

Была такая же проблема!Для меня это было так же, как сказал Керзек, ссылка один на один с разными именами столбцов.Я добавил ограничение = "ложь" в соответствие один к одному:

<one-to-one name="Person" class="PersonClass" cascade="none" constrained="false" fetch="join"/>
0 голосов
/ 21 августа 2015

Ошибка неоднозначна.

В моем случае это было из-за динамически сгенерированного оператора HQL, в котором отсутствовало предложение HQL where, хотя в нем были условия.НЕПРАВИЛЬНО сгенерированный HQL был чем-то вроде

from User u
  left join u.Profile
    (id = :id)

Где-то в цепочке построения запроса отсутствовало предложение where.Так что это становится:

from User u
  left join u.Profile
    where (id = :id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...