NHibernate - Сохранить ребенка - только установить ключ от родителя - PullRequest
0 голосов
/ 23 мая 2010

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

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

в NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved (String entityName, Object entity, сеанс ISessionImplementor) в NHibernate.Type.EntityType.GetIdentifier (значение объекта, сеанс ISessionImplementor) в NHibernate.Type.ManyToOneType.IsDirty (объект старый, объект текущий, логический [] проверяемый, сеанс ISessionImplementor) в NHibernate.Type.TypeFactory.FindDirty (свойства StandardProperty [], Object [] x, Object [] y, Boolean [] [] includeColumns, логические anyUninitializedProperties, сеанс ISessionImplementor) в NHibernate.Persister.Entity.AbstractEntityPersister.FindDirty (Object [] currentState, Object [] previousState, Объектный объект, сеанс ISessionImplementor) в NHibernate.Event.Default.DefaultFlushEntityEventListener.DirtyCheck (событие FlushEntityEvent) в NHibernate.Event.Default.DefaultFlushEntityEventListener.IsUpdateNeeded (событие FlushEntityEvent, Boolean 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:

<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.

Спасибо.

С наилучшими пожеланиями, Томас

1 Ответ

9 голосов
/ 23 мая 2010

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

mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId);
session.Flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...