2010-09-09 61 views
0

我在保存一對一關係的實體時遇到問題。我只想保存父實體並讓孩子保存,但我不得不另存兩個文件。NHibernate一對一關係不能正確保存

這是我不得不做的一個例子,否則孩子沒有保存。

var session = SessionProvider.OpenSession.Session; 
      using (var tx = session.BeginTransaction()) 
      { 
       try 
       { 
        session.SaveOrUpdate(parent); 
         if (parent.Child.IsPersisted) 
         { 
          session.Update(parent.Child); 
         } 
         else 
         {  
          session.Save(parent.Child); 
         } 
        } 
} 


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="xxx"> 
    <class name="Parent" polymorphism="explicit" table="Parent"> 
    <id name="Id" column="JointID" type="int"> 
     <generator class="native" /> 
    </id> 
    <one-to-one name="Child" class="Child" /> 
    </class> 
</hibernate-mapping> 


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" 
        assembly="xxx"> 
    <class name="Child" xmlns="urn:nhibernate-mapping-2.2" polymorphism="explicit" table="Child"> 
    <id name="Id" column="JointID" type="int" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Parent" column="JointID" insert="false" update="false" /> 
    </class> 
</hibernate-mapping> 

任何想法,我怎麼能省下來,而不必做兩個保存調用?

當我將關係設置爲如下建議的級聯時,我得到外鍵約束錯誤。如果我用NHProf分析查詢,它試圖在insert語句中使用臨時id(-1)作爲JointId,而不是新創建的父ID。 父表中的JointId是身份密鑰,也許這是一個問題?

回答

0

您需要在<one-to-one>映射上啓用級聯才能正常工作。

喜歡的東西:

<one-to-one name="Child" class="Child" cascade="save-update" /> 

您可以在各種級聯設置here閱讀起來。

+0

增加了對此問題的更多詳細信息。感謝您指出。 – Dan 2010-09-09 17:18:38

+0

您是否將您的孩子實體的父母關係設置爲財產?你需要確保你做的是這樣的:parent.Child = child AND child.Parent = parent;這可能是問題嗎? – DanP 2010-09-09 17:31:33

+0

我是否必須明確地做到這一點?我在保存之前嘗試過'parent.Child.Parent = parent',並且存在相同的問題。 – Dan 2010-09-10 10:09:39