在nhibernate中使用联接

本文关键字:nhibernate | 更新日期: 2023-09-27 17:59:06

我的应用程序代码如下所示

表格

tblPerson
---------
PersonId (PK)
Name
tblAddress
----------
AddressId(PK)
Address
PersonAddress
-------------
PersonId (PK)
AddressId

实体类

PersonAddresstbl.cs

public class PersonAddressl
{
    private int personid;
    private int addressid;
    private string name;
    public virtual int PersonId
    {
        get { return personid; }
        set { personid = value; }
    }
    public virtual int AddressId
    {
        get { return addressid; }
        set { addressid = value; }
    }
    public virtual string Name
    {
        get { return name; }
        set { name = value; }
    }
}

xml文件

个人地址tbl.hbn.xml

<class name="PersonAddressl">
  <id name="id" column="PersonId">
    <generator class="native"/>
  </id>
  <join table="tblPersonAddress"
      optional="true">
    <key column="PersonId"
        unique="true"/>
    <many-to-one name="Address"
        column="AddressId"/>
  </join>
</class>
<class name="tblAddress">
  <id name="id" column="AddressId">
    <generator class="native"/>
  </id>
</class>

实现是

PersonAddresstbl tbl = new PersonAddresstbl();
Criteria crit = session.CreateCriteria(typeof(PersonAddresstbl));
IList lst = crit.List();

返回0条记录。

有人能告诉我我走的是正确的路还是哪里错了吗?

谢谢,Pavan

在nhibernate中使用联接

很难判断问题是什么,但在进行故障排除时,我总是在nHibernate中使用启用show_sql,这样我就可以看到生成的sql(因此您可以在数据库查询窗口中尝试)。有关信息,请参阅此链接:在nHibernate 中启用show_sql

我觉得奇怪的是,你的类'Person'有一个类型为integer的属性'AddressId',而在你的映射(Person类的,它有一个奇怪的名称PersonAddressl')中,你指定你与类'Address'有一对多的关系。除此之外,我看不出您有一个类"Address"。而且,您的数据库模型在Person和Address之间具有多对多关系。

您使用的是join映射,它使您能够将两个数据库表中的数据"合并"到一个类中,但您的类模型没有反映这一点。请在此处查看有关联接属性的更多信息:http://ayende.com/blog/3961/nhibernate-mapping-join

同时检查"设置":http://ayende.com/blog/3943/nhibernate-mapping-set