返回“对象引用未保存的瞬态实例”

时间:2011-08-16 09:39:31

标签: c# nhibernate nhibernate-mapping

我有两个类ForecastCost,它们之间定义了多对多关系。我们现在已在链接表中添加了“订单”列(因此我们的客户可以在Cost内指定Forecast的订单。为了在我们的映射中反映这一点,我们创建了一个新实体ForecastCost,并将ForecastCost之间的多对多替换为Forecast 1- * {{ 1}} * -1 ForecastCost

映射看起来像这样:

Forecast.hbm.xml:

Cost

ForecastCost.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  namespace="FinRep" assembly="FinRep">
  <class name="Forecast" table="FORECAST" polymorphism="implicit">
    <id name="Id" column="PKFORECAST" type="long" access="field.camelcase" unsaved-value="0"><!-- ... --></id>

    <!-- ... -->

    <bag name="KostComponenten" table="FORECASTCOST" access="field.camelcase" lazy="false" cascade="save-update">
      <key column="FKFRBFORECAST"></key>
      <one-to-many class="ForecastCost" />
    </bag>
  </class>
</hibernate-mapping>

首先,<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="FinRep" assembly="FinRep"> <class name="ForecastCost" table="FORECASTCOST"> <composite-id name="ForecastCostId" class="FinRep.ForecastCostKey, FinRep"> <key-many-to-one name="Forecast" column="FKFORECAST" lazy="false" class="FinRep.Forecast, FinRep" /> <key-many-to-one name="Cost" column="FKCOST" lazy="false" class="FinRep.Cost, FinRep" /> </composite-id> <property name="Order" column="ORDER" /> </class> </hibernate-mapping> 映射中包中的'cascade'属性未设置,因此当我尝试保存与Forecast链接的Forecast时,我(理所当然地)得到一个错误,说无法从数据库中检索相关的Cost对象。我认为添加'cascade'属性可以解决这个问题,但现在当我尝试保存ForecastCost#1(例如)时,我得到一个异常,说Forecast类型=预测实体= 1。

我认为正在发生的是它试图保存Forecase,并且通过这样做它还会尝试保留链接到它的所有object references an unsaved transient instance - save the transient instance before flushing / ForecastCost个对象,但是{{1} } object还有一个返回我们正在保存的Cost实体的链接(但尚未保存,因此是瞬态的),因此它出错了。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

只是另一种方法,让你留在你的课程。

class ForeCast
{
    // public virtual ICollection<Kost> KostComponenten { get; set; } // old
    public virtual IList<Kost> KostComponenten { get; set; }          // new
}

并映射它:

<list name="KostComponenten" table="FORECASTCOST" access="field.camelcase" lazy="false" cascade="save-update">
  <key column="FKFRBFORECAST"/>
  <index column="order"/>
  <many-to-many class="ForecastCost" />
</bag>

然后订单在列表中,您可以执行KostComponenten.Insert(...)KostComponenten.Add(...)等等