【问题标题】:Updating an entity and ignore child proxies when using NHibernate StatelessSession使用 NHibernate StatelessSession 时更新实体并忽略子代理
【发布时间】:2011-11-07 15:32:38
【问题描述】:

我正在尝试使用 StatelessSession 批量更新实体。

因为它是无状态的,NHibernate 不会在保存时自动级联子实体。

这很好,因为我不想对任何子实体进行任何更改。

不幸的是,在保存时,NHibernate 抱怨:

“对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:MyAssembly.MyRandomEntity,实体:Castle.Proxies.MyRandomEntityProxy”

当然,如果我尝试更新子实体,我会收到错误:

“没有持久性:Castle.Proxies.MyRandomEntityProxy”

如您所见,子实体是代理,因为它尚未加载。我不需要它,我不想更新它……但即使我这样做了,我也不知道该怎么做。

知道如何解决这个问题,基本上是告诉它忽略瞬态子实体吗?

更新

这是子实体在父对象上的映射:

<many-to-one class="MyAssembly.Flight, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="OutboundFlight">
  <column name="OutboundFlightId" />
</many-to-one>

这是子实体上的 Id 列:

<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
  <column name="FlightId" />
  <generator class="assigned" />
</id>

【问题讨论】:

  • 为什么代理是瞬态的?如果它是在检索它时创建的,那么 unsavedvalue 的映射是不正确的。否则是谁在创造它?
  • 取回的时候一定要创建,我没动。映射会以什么方式出错?我正在使用 Fluent Nhibernate,并且没有对该子实体的映射做任何特定的事情。
  • MyRandomEntity 的 id 映射是什么样的?
  • 嗯,这是个好问题...我正在使用 Sharp Architecture (EntityWithTypedId, IHasAssignedId),所以它都被隐藏了...
  • 已编辑问题以包含映射...这有帮助吗?

标签: nhibernate sharp-architecture stateless-session


【解决方案1】:

它使用分配的生成器,该生成器使用“未保存值”来了解实例是永久的还是瞬态的。也许数据库中真的有一个 id = 0 的 Flightobject?然后它将被创建为 Id = 0 的代理,这将被视为瞬态实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多