2011-03-14 3 views
4

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

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; } 
    } 

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

using (ISession session = SessionFactory.OpenSession()) 

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

+0

Я видел эту ошибку, прежде чем я думаю. Попробуйте восстановить приложение и снова запустите его. Посмотрите, какое первое исключение получает. – jjnguy

+0

Не могли бы вы показать в качестве кода, что доза сохраняется ... –

+0

Просто сделал. Это исключает одно и то же исключение. – kartikq

ответ

4

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

Я установил его, добавив

public virtual String Description { get; set; } 

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

Edit:

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

Пожалуйста, убедитесь, что все ваши .hbm.xml файлы вложенные ресурсы.

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

+0

Ах да, у меня есть это. Ошибка копирования-вставки. Спасибо что подметил это. – kartikq

+0

@kartikq Если бы этот ответ помог вам, почему бы вам не выбрать его в качестве выбранного ответа или хотя бы проголосовать за него? –

+0

@ Илья извините. Upvoted! – kartikq

0

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

В моем случае это произошло из-за динамически сгенерированного оператора HQL, в котором отсутствовала статья HQL where, хотя у нее были условия.

То есть, Wrongly генерироваться HQL было что-то вроде

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

Где-то в цепочке создания запроса, был недостающий where положение. Так что она становится:

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

была такая же проблема! Для меня это было так же, как сказал Керзек, от одной к одной ссылке с разными названиями колонок.Я добавил ограниченное значение = «false» к сопоставлению от одного к одному:

<one-to-one name="Person" class="PersonClass" cascade="none" constrained="false" fetch="join"/> 
Смежные вопросы