8

我在更新期间提交时收到错误错误脱水属性值。我已经搜索过,它看起来类似于NHibernate: Error dehydrating property - 这到底是什么?唯一的区别是在提到的问题 NHibernate 抱怨Unable to resolve property

IssuingOffice 的值已存在于数据库中,因此它不会是引用未保存记录的问题

以下是详细的错误。

Test 'Tests.Services.StickerInvoiceServiceTests.update_sticker_info_succeeds' failed:
NHibernate.PropertyValueException : Error dehydrating property value for
Model.StickerInvoice.StickerIssuingOffice
----> NHibernate.TransientObjectException : object references an unsaved transient 
instance - save the transient instance before flushing or set cascade action for the property to something that would make it autosave. Type: Model.IssuingOffice, Entity: Model.IssuingOffice
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
at NHibernate.Action.EntityUpdateAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
UnitOfWork.cs(39,0): at NhRepository.UnitOfWork.Commit()
StickerInvoiceService.cs(73,0): at Services.StickerInvoiceService.UpdateStickerInfo(StickerInvoice entity, IEnumerable`1& brokenRules)
Services\StickerInvoiceServiceTests.cs(131,0): at Tests.Services.StickerInvoiceServiceTests.update_sticker_info_succeeds()
--TransientObjectException
at NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session)
at NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session)
at NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)

发行办公室的映射

<class name="IssuingOffice" table="IssuingOffice">
<id name="Id">
  <generator class ="hilo">
    <param name ="table">IdGenerator</param>
    <param name ="column">NextHigh</param>
    <param name ="max_lo">2</param>
    <param name ="where">TableKey = 'IssuingOffice'</param>
  </generator>
</id>
<version name="Version" column="Version" />
<property name ="Name" length="150" not-null="true" unique="true" />
<bag name ="IssuedStickers" table ="StickerInvoice" generic="true" inverse="true">
  <key column ="StickerIssuingOfficeId" />
  <one-to-many class ="StickerInvoice"/>
</bag>

发行办公室的架构

CREATE TABLE IssuingOffice(
 Id   int  NOT NULL,
 Name   nvarchar (150) NOT NULL,
 Version   int  NOT NULL,
   CONSTRAINT  PK_IssuingOffice  PRIMARY KEY ( Id  ASC )
 ) 

StickerInvoice 的映射

<class name="StickerInvoice" table="StickerInvoice">
<id name="Id">
  <generator class ="hilo">
    <param name ="table">IdGenerator</param>
    <param name ="column">NextHigh</param>
    <param name ="max_lo">5</param>
    <param name ="where">TableKey = 'StickerInvoice'</param>
  </generator>
</id>
<version name ="Version" />
<property name ="RefNo" length="50" not-null="true" />
<property name ="Period" not-null="true" />
<property name ="Amount" not-null="true"/>
<property name ="DueDate" not-null="true"/>
<property name ="Penalty" not-null="true"/>
<property name ="InvoiceNo" length="50"/>
<property name ="DateIssued" />
<property name ="ReceiptNo" length="50" />
<property name ="DatePaid" />
<property name ="StickerNo" length="50" />
<many-to-one name ="Vehicle" class="Vehicle" column ="VehicleId" />
<many-to-one name ="StickerIssuedBy" class="User" column ="StickerIssuedById" />
<many-to-one name ="StickerIssuingOffice" class="IssuingOffice" column ="StickerIssuingOfficeId" />

StickerInvoice 的架构

CREATE TABLE StickerInvoice(
    Id int NOT NULL,
RefNo nvarchar(50) NOT NULL,
VehicleId int NOT NULL,
DateIssued datetime NOT NULL,
Period datetime NOT NULL,
Amount decimal(18, 0) NOT NULL,
DueDate datetime NOT NULL,
Penalty decimal(18, 0) NOT NULL,
InvoiceNo nvarchar(50) NULL,
ReceiptNo nvarchar(50) NULL,
DatePaid datetime NULL,
StickerNo nvarchar(50) NULL,
StickerIssuedById int NULL,
StickerIssuingOfficeId int NULL,
Version int NOT NULL,
  CONSTRAINT PK_StickerInvoice PRIMARY KEY ( Id ASC )
)  

我尝试了数据类型不匹配或重复属性,但没有找到。

任何帮助将不胜感激。

4

3 回答 3

8

如果您更仔细地查看您的异常,您会看到以下错误:

NHibernate.TransientObjectException :对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例,或将属性的级联操作设置为使其自动保存的内容。类型:Model.IssuingOffice,实体:Model.IssuingOffice

基本上,看起来您正在尝试保存IssuingOffice包含一个或多个 unsaved StickerInvoice。您需要将级联选项设置为IssuingOffice包映射。

<bag name="IssuedStickers" table="StickerInvoice" 
     generic="true" inverse="true" cascade="save-update">
  <key column="StickerIssuingOfficeId" />
  <one-to-many class="StickerInvoice"/>
</bag>
于 2012-07-14T08:54:54.917 回答
5

我通过设置关系的多对一部分的 ReadOnly 标志解决了这个异常:

References(x => x.Parent).ReadOnly();
于 2015-10-21T07:53:43.587 回答
-1

当您尝试使用 Id = 0 保存对象时出现此错误

于 2021-03-09T18:49:38.103 回答