“给定的密钥没有出现在字典中”nHibernate C#

时间:2011-03-14 19:17:57

标签: c# nhibernate

对于nHibernate来说,这是一个新手。我在两个表“User”和“UserProfile”之间设置了以下一对一映射。

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

现在,当我尝试保留“User”对象时,我得到一个异常: “字典中没有给定的密钥”,如下所示:

using (ISession session = SessionFactory.OpenSession())

有谁知道这里会发生什么?

3 个答案:

答案 0 :(得分:4)

我将你的hbm映射和你的类复制到我的测试项目中。我在创建SessionFactory时遇到错误。您是否有机会在第一次在using-Statement中访问时创建SessionFactory?如果是这样,那么这将有望解决问题:

我通过添加

修复了它
public virtual String Description { get; set; }

到UserProfile类。 如果你的代码中有这个,只是忘了在复制和粘贴期间,我会尝试进一步调查。

修改

此错误的另一个可能来源 - 找到here

请验证所有.hbm.xml文件都是嵌入资源。

如果仍然没有帮助,请您发布异常的StackTrace吗?

答案 1 :(得分: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)

答案 2 :(得分:0)

有同样的问题!对我而言,就像克尔泽克所说的那样,一对一的参考文献具有不同的列名。我将constrained =“false”添加到一对一映射中:

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