NHibernate一对多映射问题

Naz*_*gul 2 .net c# nhibernate one-to-many nhibernate-mapping

我必须映射两个具有外键关系的简单表.其中一个表是包含列id(类型为int的主键),名称,地址guid(新添加且不是主键)的Contact.另一种是phone__number含有列ID(int类型的主键),contact___id(在接触表ID的外键)和phone__number.

Contact表的映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
  <class name="Contact" table="Contact">
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>

    <property name="Name" column="name" type="string"/>
    <property name="Address" column="address" type="string"/>
    <property name="Guid" column="guid" type="string"/>

    <set lazy="true" batch-size="6" table="phone_number" name="PhoneNumbers" fetch="join" inverse="false" cascade="all" >
      <key foreign-key="FK_contact_phone_number" column="contact_id"/>
      <one-to-many class="PhoneNumber" />
    </set>

  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Phone_number表的映射文件是:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
  <class name="PhoneNumber" table="phone_number">
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>
    <property name="ContactId" column="contact_id" />
    <property name="Number" column="phone_number" />
  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Contact和PhoneNumber类是:

namespace OfflineDbSyncWithNHibernate.Models
{
    public class Contact
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string Address { get; set; }
        public virtual string Guid { get; set; }
        public virtual PhoneNumbers PhoneNumbers { get; set; }
    }
}

namespace OfflineDbSyncWithNHibernate.Models
{
    public class PhoneNumber
    {
        public virtual int Id { get; set; }
        public virtual int ContactId { get; set; }
        public virtual string Number { get; set; }
    }
}

namespace OfflineDbSyncWithNHibernate.Models
{
    public class PhoneNumbers : List<PhoneNumber>
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

当我分别加载contact和phone_numbers时,它可以工作,但是在添加set元素以获得一对多关系后,nhibernate会给出一个错误:

NHibernate.MappingException:为类型OfflineDbSyncWithNHibernate.Models.Contact指定的无效映射信息,检查映射文件中是否存在属性类型不匹配

我是nHibernate的新手,所以我不确定set元素中是否有错误,或者我甚至不应该使用它.任何帮助将不胜感激.

Bri*_*hra 11

记住这一点

  • Bag使用IList实现
  • Set使用ISet实现
  • List是使用ArrayList或List实现的
  • 使用HashedTable或IDictionary实现Map

如果你想使用IList使用第一个规则,即改变你的hbm.xml来使用Bag而不是Set你的Phonenumbers类应该继承IList而不是List,如果你想使用List你将需要更改你的映射文件以使用List而不是集合.