NHibernate-保存子项-仅从父项设置密钥
我有休闲问题: 我必须列出SalesHeader和SalesPosition,其中SalesPosition是SalesHeader的子级。 现在。在表SalesHeader中,有一个持久化实体X。我现在尝试在SalesPosition中持久化一个实体,只给这个实体X(of SalesHeader)的键。NHibernate不必在SalesHeader中保存一些数据。现在,当我将实体刷新到SalesPosition时,我将成为一个例外: 对象引用未保存的临时实例-在刷新之前保存临时实例 位于NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsave(字符串entityName、对象实体、ISessionImplementor会话) 位于NHibernate.Type.EntityType.GetIdentifier(对象值,ISessionImplementor会话) 在NHibernate.Type.ManyToOneType.IsDirty(对象旧、对象当前、布尔[]可检查、ISessionImplementor会话) 在NHibernate.Type.TypeFactory.findderty(标准属性[]属性,对象[]x,对象[]y,布尔值[][]includeColumns,布尔值anyUninitializedProperties,ISessionImplementor会话) 位于NHibernate.Persister.Entity.AbstractEntityPersister.FindParty(对象[]当前状态,对象[]先前状态,对象实体,ISessionImplementor会话) 在NHibernate.Event.Default.DefaultFlushEntityEventListener.DirtyCheck(FlushEntityEvent事件)中 在NHibernate.Event.Default.DefaultFlushEntityEventListener.IsUpdateNecessary(FlushEntityEvent事件,布尔值可能为Dirty) 在NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件)中 位于NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent事件) 在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlusheEvent事件)中 在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件) 在NHibernate.Impl.SessionImpl.Flush()处 在NHibernate.Transaction.AdoTransaction.Commit()处 这是我对SalesPosition的映射:NHibernate-保存子项-仅从父项设置密钥,nhibernate,Nhibernate,我有休闲问题: 我必须列出SalesHeader和SalesPosition,其中SalesPosition是SalesHeader的子级。 现在。在表SalesHeader中,有一个持久化实体X。我现在尝试在SalesPosition中持久化一个实体,只给这个实体X(of SalesHeader)的键。NHibernate不必在SalesHeader中保存一些数据。现在,当我将实体刷新到SalesPosition时,我将成为一个例外: 对象引用未保存的临时实例-在刷新之前保存临时实例 位于NH
.... 一些领域
这是SalesHeader的映射:
... 一些领域
有谁能告诉我一个提示,我必须做的是,我只能将SalesHeader的键交给SalesPosition实体进行持久化(或者SalesHeader实体和NHibernate仅使用该键)
我使用NHibernate的最新版本
多谢各位
向您致意,Thomas如果我正确理解您的问题,您正在尝试保存SalesPosition实例,但您只想设置SalesPosition.SalesHeader.Id,而不是将SalesPosition.SalesHeader设置为SalesHeader的实例。您可以使用ISession.Load完成这一任务;解释它是如何工作的。基本上,如果知道数据库中存在实体,可以使用Load为对象创建代理,而不是从数据库获取代理。这在无状态(web)应用程序中非常方便。使用方法如下:
mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId);
session.Flush();
mySalesPosition.SalesHeader=session.Load(salesHeaderId);
session.Flush();
对不起,您的问题很难理解。现在我只能说:如果SalesPosition是一个子SalesHeader(一对多关系,类似于bill和bill items),那么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>
mySalesPosition.SalesHeader = session.Load<SalesHeader>(salesHeaderId);
session.Flush();