2010-05-23 70 views
0

我有下面的問題: 我必須表SalesHeader和SalesPosition - 其中SalesPosition是SalesHeader的孩子。 現在。在表SalesHeader中,有一個持久化的實體X.我現在嘗試在SalesPosition中堅持一個實體,只給這個實體X的鍵(SalesHeader)。 NHibernate不需要在SalesHeader中保存一些數據。現在,當我將實體刷新到SalesPosition時,我成爲下面的例外:NHibernate - 保存孩子 - 只從父母設置密鑰

對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例。

在NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(字符串的entityName,對象實體,ISessionImplementor會議) 在NHibernate.Type.EntityType.GetIdentifier(對象的值,ISessionImplementor會議) 在NHibernate.Type.ManyToOneType.IsDirty(舊對象,對象當前,布爾[]可檢查,ISessionImplementor會話) 在NHibernate.Type.TypeFactory.FindDirty(StandardProperty []屬性,對象[] x,對象[] y,布爾[] [] includeColumns,布爾anyUninitializedProperties,ISessionImplementor會話)在NHibernate.Persister.Entity.AbstractEntityPersister.FindDirty(Object [] currentState,Object [] previousState,Object entity,ISessionImplementor session)中的 at NHibernate.Event.Default.DefaultFlus hEntityEventListener.DirtyCheck(FlushEntityEvent事件) 在NHibernate.Event.Default.DefaultFlushEntityEventListener.IsUpdateNecessary(FlushEntityEvent事件,布爾mightBeDirty) 在NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件) 在NHibernate.Event.Default.AbstractFlushingEventListener。 FlushEntities(FlushEvent事件) 在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent事件) 在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件) 在NHibernate.Impl.SessionImpl.Flush() 在NHibernate的。 Transaction.AdoTransaction.Commit()

這是我的媽媽SalesPosition的pping:

<class name="SalesPosition" table="SalesPosition" lazy="false" > 
    <id name="Id" column="Id" type="Guid">  
        <generator class="assigned"/> 
    </id> 
    <version name="ObjectVersion" column="ObjectVersion"/> 
    .... some fields 
    <many-to-one name="SalesHeader" class="SalesHeader" foreign-key="FK_SalesHeader_SalesPosition" > 
     <column name="SalesHeaderId"/> 
    </many-to-one> 
</class> 

,這是SalesHeader的映射:

<class name="SalesHeader" table="SalesHeader" lazy="false" > 
    <id name="Id" column="Id" type="Guid">  
        <generator class="assigned"/> 
    </id> 
    <version name="ObjectVersion" column="ObjectVersion"/> 
... some fields 
    <set name="SalesPosition" lazy="true" inverse="true" cascade="delete" > 
     <key> 
      <column name="SalesHeaderId"/> 
     </key> 
     <one-to-many class="SalesPosition"/> 
    </set> 
</class> 

任何人都可以給我一個提示,我要做什麼,我只能將SalesHeader的關鍵字放到SalesPosition-Entity中進行持久化(或者SalesHeader-Entity和NHibernate只使用鍵)。

我使用最新版本的NHibernate。

謝謝。

最好的問候,托馬斯

+0

對不起,但您的問題很難關注。我現在可以說的是:如果SalesPosition是子SalesHeader(一對多關係,如賬單和賬單項目),則您的SalesHeader映射是錯誤的,因爲您正在執行映射,就好像它是多對一多種關係。 – 2010-05-23 14:49:35

回答

8

如果我正確理解你的問題,你正試圖保存一個SalesPosition實例,但你只想設置,而不是設置SalesPosition.SalesHeader到SalesHeader的實例SalesPosition.SalesHeader.Id。你可以使用ISession.Load完成這個; this posting解釋了它是如何工作的。基本上,如果您知道數據庫中存在實體,則可以使用Load爲對象創建代理,而不是從數據庫中獲取代理。這在無狀態(web)應用程序中非常方便。用法將是:

mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId); 
session.Flush(); 
+0

嗨。 非常感謝。這正是我正在尋找的! – BennoDual 2010-05-24 09:55:45

+3

你應該接受他的回答。 – epitka 2010-05-24 13:52:45