对于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())
有谁知道这里会发生什么?
答案 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"/>