NHibernate的 - 错误脱水属性值 [英] NHibernate - Error dehydrating property value

查看:950
本文介绍了NHibernate的 - 错误脱水属性值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到错误错误的脱水而更新期间犯下的属性值。我已经搜查,它类似于 NHibernate的错误:脱水性能 - 到底这是什么原因?的是,在所指向的问题NHibernate的抱怨无法解析属性

I am getting the error Error dehydrating property value for while committing during update. I have searched and it looks similar to NHibernate: Error dehydrating property - What the heck is this? the only difference being that in the refered question NHibernate was complaining of Unable to resolve property

价值,唯一的区别对于IssuingOffice已经在数据库中存在的,因此不能引用一个未保存记录的问题。

Value for IssuingOffice is already existing in the database so it cannot be an issue of referencing an un-saved record

以下是详细的错误。

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)

映射IssuingOffice

Mapping for IssuingOffice

<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>



模式为IssuingOffice

Schema for IssuingOffice

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

映射StickerInvoice

Mapping for 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

Schema for 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 )
)  

我试过数据类型不匹配或重复的特性,但没有找到。

I tried for datatype mismatches or repeated properties but found none.

任何。援助可以理解的。

Any assistance will be appreciated.

推荐答案

如果你更仔细地看看你的异常,你会看到这个错误:

If you take a look at your exception more carefully, you'll see this error:

NHibernate.TransientObjectException:对象引用一个未保存
瞬态的实例 - 冲洗或
为一套级联行动之前保存的瞬态的实例该属性的东西,将使它
自动保存。类型:Model.IssuingOffice,实体:Model.IssuingOffice

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

基本上,看起来像你正试图拯救 IssuingOffice 包含一个或多个未保存 StickerInvoice 。您需要将级联选项设置为 。IssuingOffice 包映射

Basically, looks like you are trying to save the IssuingOffice containing one or more unsaved StickerInvoice. You need to set the cascading option to IssuingOffice bag mapping.

<bag name="IssuedStickers" table="StickerInvoice" 
     generic="true" inverse="true" cascade="save-update">
  <key column="StickerIssuingOfficeId" />
  <one-to-many class="StickerInvoice"/>
</bag>

这篇关于NHibernate的 - 错误脱水属性值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆