2010-05-23 4 views
0

У меня возникает проблема: У меня есть таблицы SalesHeader и SalesPosition - где SalesPosition является дочерним элементом SalesHeader. Теперь. В таблице SalesHeader существует постоянная Entity X. Я пытаюсь теперь удерживать Entity в SalesPosition, предоставляя этому Entity ключу X (SalesHeader). NHibernate не должен сохранять некоторые данные в SalesHeader. Теперь, когда я очищаю объект до SalesPosition, я становлюсь побочным исключением:NHibernate - Сохранить ключ только для детей от родителя

Объект ссылается на несохраненный экземпляр переходного процесса - сохраняет временный экземпляр перед промывкой.

в NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved (String EntityName, объекта Object, ISessionImplementor сессия) в NHibernate.Type.EntityType.GetIdentifier (значение объекта, ISessionImplementor сессия) в NHibernate.Type.ManyToOneType.IsDirty (Object старый , Object current, Boolean [] checkable, сеанс ISessionImplementor) at NHibernate.Type.TypeFactory.FindDirty (свойства StandardProperty [], Object [] x, Object [] y, Boolean [] [] includeColumns, Boolean anyUninitializedProperties, сеанс ISessionImplementor) at NHibernate.Persister.Entity.AbstractEntityPersister.FindDirty (Object [] currentState, Object [] previousState, объект объекта, сеанс ISessionImplementor) в 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()

это моя мама pping из SalesPosition:

<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 неверно, поскольку вы выполняете сопоставление, как если бы оно было многозначным -ное отношение. –

ответ

8

Если я правильно понимаю ваш вопрос, вы пытаетесь сохранить экземпляр SalesPosition, но вы хотите просто установить SalesPosition.SalesHeader.Id вместо установки SalesPosition.SalesHeader к экземпляру SalesHeader. Вы можете выполнить это, используя ISession.Load; this posting объясняет, как это работает.В принципе, если вы знаете, что сущность существует в базе данных, вы можете использовать Load для создания прокси-сервера для объекта, а не для его получения из базы данных. Это очень удобно в приложениях без гражданства (в Интернете). Использование будет:

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

Привет. спасибо. Это то, что я ищу! – BennoDual

+3

Затем вы должны принять его ответ. – epitka

Смежные вопросы