0

私は NHibernate で簡単な関連付けを設定しようとしています (これは私がそれをゼロから利用したい最初のプロジェクトです) - それは単純で不自然な本の例のように見えますが、何らかの理由で私はリレーションを双方向に動作させることはできません。

多くのアドレスを含めることができる Contact というクラスがあります。

簡略化された Contact クラスは次のとおりです。

public class Contact {

// firstName, lastName, etc, etc omitted

// ixContact is the identity value
public virtual int ixContact { get; set; }
public virtual ICollection<Address> addresses { get; set; }

}

住所は次のとおりです。

public class Address {
       public virtual int ixAddress { get; set; }
       public virtual Contact contact { get; set; }
}

マッピング ファイル Contact.hbm.xml の関連部分は次のとおりです。

<id name="ixContact">
    <generator class="hilo" />
</id>

<bag name="Addresses" inverse="true" cascade="save-update">
     <key column="ixContact" />
     <one-to-many class="Address />
</bag>

Address.hbm.xml マッピング ファイルの関連部分は次のとおりです。

<id name="ixAddress">
    <generator class="hilo" />
</id>

<many-to-one name="contact" class="Contact" column="ixContact" />

そのセットアップを考慮して、次のコードを実行します。

_configuration = new Configuration();
    _configuration.Configure();
    _configuration.AddAssembly(typeof(Contact).Assembly);

    _sessionFactory = _configuration.BuildSessionFactory();

    _session = _sessionFactory.OpenSession();

    new SchemaExport(_configuration).Execute(false, true, false);

    Contact firstContact = new Contact { firstName = "Joey", middleName = "JoeJoe", lastName = "Shabadoo" };

    using( ITransaction tx = _session.BeginTransaction()) {

           firstContact.Addresses = new List<Address>();
           Address firstAddress = new Address { /* address data */ };

        firstContact.Addresses.Add(firstAddress);

      _session.SaveOrUpdate(firstContact);

      tx.Commit();
    }


    _session.Close();

    _session.Dispose();

このコードを実行すると、連絡先が連絡先テーブルに正常に挿入され、住所も住所テーブルに挿入されます。ただし、住所の ixContact フィールドが NULL であり、連絡先の ixContact フィールドの値に関連付けられていません期待するでしょう。

関係の反対側を明示的に指定して と言うとfirstAddress.Contact = firstContact、正常に動作しますが、NHibernate がこれを自動的に処理するという印象を受けましたか?

もしそうなら、私は何を間違っていますか?それともRandomContact.Addresses.Add(foo), foo.Contact = RandomContact毎回指定する必要がありますか?

4

2 に答える 2

0

うーん、電話をかける_session.Save(firstContact);前に電話に出られなかったようですtx.Commit();

于 2011-05-04T16:57:51.197 に答える
0

関係の両側を明示的に設定する必要があります。

于 2011-05-12T17:24:51.863 に答える