代码之家  ›  专栏  ›  技术社区  ›  BennoDual

NHibernate-保存子级-仅从父级设置密钥

  •  0
  • BennoDual  · 技术社区  · 14 年前

    我有一个问题: 我必须列出SalesHeader和SalesPosition表,其中SalesPosition是SalesHeader的子表。

    对象引用一个未保存的临时实例-在刷新之前保存临时实例。

    在NHibernate.Type.EntityType.GetIdentifier(对象值,ISessionImplementor会话) 在NHibernate.Type.TypeFactory.findderty(标准属性[]属性,对象[]x,对象[]y,布尔值[]includeColumns,布尔值anyUninitializedProperties,ISessionImplementor会话) 在NHibernate.Event.Default.DefaultFlushEntityEventListener.DirtyCheck(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.adotransation.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实体进行持久化(或者SalesHeader实体和NHibernate只使用该键)。

    非常感谢。

    祝你好运,托马斯

    1 回复  |  直到 14 年前
        1
  •  9
  •   Jamie Ide    14 年前

    如果我正确理解了您的问题,您正试图保存SalesPosition实例,但您只想设置SalesPosition.SalesHeader.Id,而不是将SalesPosition.SalesHeader设置为SalesHeader的实例。您可以使用ISession.Load; this posting 解释了它的工作原理。基本上,如果知道数据库中存在实体,可以使用Load为对象创建代理,而不是从数据库中获取它。这在无状态(web)应用程序中非常方便。用法如下:

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