2012-07-14 3 views
8

更新中にコミット中にプロパティー値の脱水エラーが発生しました。私が検索しましたし、それが参照の問題になることはできませんので、それはNHibernate: Error dehydrating property - What the heck is this?参照さ質問にNHibernateのプロパティにIssuingOfficeが既にデータベースに存在しているためNHibernate - プロパティー値の脱水エラー

値を解決することができませんを訴えたことが唯一の違いに似ています未保存レコード

以下は詳細なエラーです。

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

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> 

スキーマ

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" /> 
012のマッピングのためのマッピング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) 
) 

ため

スキーマ私は、データ型の不一致または反復的特性のために試みたが、どれも見つかりませんでした。

ご協力いただければ幸いです。

答えて

7

あなたはより慎重にあなたの例外を見ている場合、このエラーが表示されます:

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

使用すると、1つまたは複数の保存されていないStickerInvoiceを含むIssuingOfficeを保存しようとしているように、基本的に見えます。 cascading optionIssuingOfficeに設定する必要があります。

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

IssuingOfficeが既にデータベースに存在するので、省または更新する必要はありませんが。私は、IssuingOfficeに影響を与えずにStickerInvoice上の既存のデータを更新したいだけです。これらのシナリオでは、実際にカスケードが必要ですか? – kagundajm

+0

次に、おそらく別のセッションで読み込まれたStickerInvoiceの一時的なインスタンスを使用しています。 –

+0

あなたの最後のコメントを調べると、IssuingOfficeのバージョンはデータの初期化時に最初は0に設定されていたことに気付きました。値を1に変更すると問題が解決しました。あなたの助けをありがとう – kagundajm

3

私は関係の多対一の部分の読み取り専用フラグを設定することで、この例外を解決:

References(x => x.Parent).ReadOnly(); 
+0

私はこの単純な修正を参照していないサンプルはなぜですか?私はこの単純な修正を探して2〜3日間浪費してきた。 – shankbond

関連する問題