2011-05-04 88 views
0

我試圖在NHibernate中建立一個簡單的關聯(這是我想從頭開始使用它的第一個項目) - 它看起來像一個簡單的,人爲的書籍示例,但由於某種原因我無法讓這種關係雙向工作。爲什麼這個簡單的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照顧了這個automagically?

如果是這樣,我做錯了什麼?或者我每次都必須指定RandomContact.Addresses.Add(foo), foo.Contact = RandomContact

+0

因此,數據是好的,但你在內存實體不是? – Vadim 2011-05-04 18:21:08

+0

運行上面的代碼示例時,數據庫中的地址記錄與聯繫人不存在關聯(從Contact-> Address有單向關聯,但不是來自Address-> Contact)。我受到了印象(雖然就像我說過的,但我肯定可能會錯),只要您在映射文件中指定了反例,NHibernate就會爲您處理關聯的鏡像。 – Whisker 2011-05-04 18:59:22

+1

是的,你需要在內存中設置關係的兩邊。檢查這些問題http://stackoverflow.com/q/1061179/40822 http://stackoverflow.com/qestions/713637/inverse-attribute-in-nhibernate – dotjoe 2011-05-04 20:17:35

回答

0

你需要明確設置的關係,雙方面前。

0

嗯,它看起來像你錯過來電_session.Save(firstContact);調用tx.Commit();

+0

哎呀 - 對不起;我在示例中錯過了這一點,但沒有在實際的代碼中。感謝您指出;我會立即糾正這個問題。 – Whisker 2011-05-04 17:13:25