質問

うれしい地図を簡単な二つのテーブルの外部キー関係です。一つのテーブルは 連絡先 を含むカラム id (主キーの型int)名称, 住所guid (新たに加えたいの尊重できる方が希望です。その他の一つは 電話__番号 を含むカラム id (主キーの型int) 連絡___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>

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

私負荷のおphone_numbers別すが、その後の追加のセット要素に対多関係の設定によりどちらのモがエラー:

設定によりどちらのモ.MappingException:無効なマッピング情報を指定したタイプOfflineDbSyncWithNHibernate.モデルです。連絡のチェックをマッピングファイルのプロパティのタイプミスマッチ

私は新しい設定によりどちらのモならない場合がありますので、セットの要素はいずれも使用しています。助りますようお願い申し上げます。

役に立ちましたか?

解決

だけで記憶するこ

  • バッグを使用して実現しIList
  • セットを使用して実現しISet
  • リストを使用して実現しArrayListリスト
  • 地図を使用して実現しHashedTableはIDictionary

を利用する場合はIList最初に使用す則ん。e変更hbm.xml 使用バッグの代わりにセットもごPhonenumbersクラスを継承からのIListなリストを利用する場合はリストを変更する必要がありますおマッピングに使用するファイルリストの代わりにセットです。

他のヒント

行きたいというニーズがPhoneNumbersクラスのニーズを受け継ぐかのサブタイプ Iesi.Collections.ISet.とは思わないがある"設定"タイプの提供です。純デフォルトです。見hibernate FAQ

の <set> 地図へ Iesi.ョンにします。ISet.このインタフェース 一部のIesi.集 組み立て配布設定によりどちらのモ.

のコレクション-ようにするべきであるインターフェースで、設定によりどちらのモまでの自分のタイプを実装するインタフェースにオブジェクトから取り出されます。

設定されていない場合はのコレクションとして

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

そして、いようにマッピング連絡先のクラスを指定する設定によりどちらのモべきアクセスの分野_phoneNumbersではなく物件のPhoneNumber:

<set name="PhoneNumbers" access="field.camelcase-underscore" ... >
   ...
</set>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top