문제

두 개의 간단한 테이블을 외국의 키 관계로 매핑해야합니다. 테이블 중 하나입니다 연락하다 열이 포함되어 있습니다 ID (유형 int의 기본 키),이름, 주소 그리고 안내 (새로 추가되었으며 기본 키가 아닙니다). 다른 하나는입니다 전화 번호 열이 포함되어 있습니다 ID (유형 int의 기본 키), contact___id (접촉 테이블에있는 ID의 외국 키) 및 전화 번호.

연락처 테이블의 매핑 파일은 다음과 같습니다.

<?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>

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>

연락처 및 전화 수업은 다음과 같습니다.

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

연락처와 phone_numbers를 별도로로드하면 작동하지만 설정 요소를 추가하여 일대일 관계를 얻은 후 NHibernate는 오류가 발생합니다.

nhibernate.mappingException : 유형의 유효하지 않은 매핑 정보 유형 OFFLINEDBSYNCWITHNHIBERNATE.MODELS.COTNACT, 속성 유형 불일치에 대한 매핑 파일을 확인하십시오.

나는 nhibernate를 처음 접했기 때문에 세트 요소에 실수가 있는지 확실하지 않거나 사용해서는 안됩니다. 모든 도움이 감사하겠습니다.

도움이 되었습니까?

해결책

그냥 기억하십시오

  • 가방은 ILIST를 사용하여 구현됩니다
  • 세트는 ISET을 사용하여 구현됩니다
  • 목록은 ArrayList 또는 List를 사용하여 구현됩니다
  • MAP는 Hashedtable 또는 Idiction을 사용하여 구현됩니다

ILIST 사용을 사용하려면 첫 번째 규칙을 사용하려면 hbm.xml을 변경하여 가방을 설정하여 설정 대신 가방을 변경하십시오. 세트.

다른 팁

나는 당신의 phoneumbers 클래스가 하위 유형에서 물려 받아야한다고 생각합니다. Iesi.Collections.ISet. 기본적으로 .NET에 제공된 "세트"유형이 있다고 생각하지 않습니다. 최대 절전 모드를 참조하십시오 자주하는 질문

그만큼u003Cset> IESI.collections.iset에지도. 이 인터페이스는 IESI의 일부입니다. Collections Assembly는 Nhibernate로 배포했습니다.

nhibernate는 객체를 DB에서 검색 할 때 해당 인터페이스를 구현하는 자체 유형을 제공하기 때문에 컬렉션 유형은 인터페이스 여야합니다.

컬렉션을 다음과 같이 정의하는 경우

public virtual ISet<PhoneNumber> Phonenumbers = new HashedSet<Phonenumber>();

그러면 나는 그것이 효과가 있다고 생각합니다.

컬렉션에 대한 액세스를 더 잘 제어하려면 다음과 같은 연락처 클래스를 수정할 수 있습니다.

public class Contact
{
    public virtual int Id {get;set;}
    ..

    private ISet<Phonenumber> _phoneNumbers = new HashedSet<PhoneNumber>();

    public ReadOnlyCollection<Phonenumber> PhoneNumbers
    {
        get 
        {
           return new List<Phonenumber>(_phoneNumbers).AsReadOnly();
        }
    }

    public void AddPhonenumber( Phonenumber n )  
    {
        n.Contact = this;
        _phoneNumbers.Add(n);
    }

    public void RemovePhoneNumber( PhoneNumber n )
    {
        ...
    }
}

그런 다음 연락처 클래스의 매핑에서 nhibernate가 속성 전화기 대신 필드 _phonenumbers에 액세스하도록 지정하도록해야합니다.

<set name="PhoneNumbers" access="field.camelcase-underscore" ... >
   ...
</set>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top