2011-03-14 41 views
4

對於nHibernate來說,這很新穎。我在兩個表「User」和「UserProfile」之間設置了以下一對一映射。「給定的密鑰不存在於字典中」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> 

我波蘇斯對於上述映射是:

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()) 

有誰知道什麼可以怎麼回事?

+0

我以前見過這個錯誤。嘗試重新構建您的應用,然後重新運行它。看看拋出的第一個異常是什麼。 – jjnguy 2011-03-14 19:20:19

+0

你可以顯示爲劑量持續的代碼用戶... – 2011-03-14 19:23:45

+0

只是做了。它引發同樣的異常。 – kartikq 2011-03-14 19:27:29

回答

4

我將你的hbm映射和你的類複製到我的測試項目中。創建SessionFactory時出現錯誤。任何機會,你創建SessionFactory的時候,首先在你的using語句中訪問它?如果是這樣,那麼這將有望解決這一問題:

我加入

public virtual String Description { get; set; } 

到用戶配置類固定它。 如果你在你的代碼中有這個,只是在複製&粘貼時忘記了,我會試着進一步調查。

編輯:

另一個可能源出於此錯誤 - 因爲發現here

請確認您所有的.hbm.xml文件是嵌入的資源。

如果仍然沒有幫助,可否請您發佈異常的StackTrace?

+0

啊,是的,我有。複製粘貼錯誤。感謝您指出了這一點。 – kartikq 2011-03-15 14:34:51

+0

@kartikq如果這個答案對你有幫助,你爲什麼不選擇它作爲選擇的答案,或者至少將它投票? – 2011-03-16 14:23:39

+0

@Ilya對此感到抱歉。 Upvoted! – kartikq 2011-03-16 15:01:45

0

錯誤不明確。

在我的情況下,這是因爲動態生成的HQL語句缺少HQL where子句,儘管它有條件。

也就是說,錯誤地產生的HQL是像

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

某處建立查詢的鏈條,有一個失蹤where條款。使之成爲:

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

有同樣的問題!對我來說,就像kerzek說的一樣,一個一對一的引用與不同的列名稱。我在一對一映射中添加了constrained =「false」:

<one-to-one name="Person" class="PersonClass" cascade="none" constrained="false" fetch="join"/> 
相關問題