24

金融システムでかなり複雑なNHibernateトランザクションを実行し、支払いを作成し、元帳エントリを記録し、支払いが請求書の合計額であるかどうかを確認し、請求書を全額支払われたものとしてマークするなど. . 楽しいことがたくさん。当然、単一のトランザクション内で発生する必要があります。

セッションに変更をコミットしようとすると、次のエラーが発生します。

Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor

これをグーグルで検索しても、多くの記録は見つかりませんでした。これが何を意味し、どこにデバッグ作業を集中させる必要があるか教えてもらえますか?

アップデート

リクエストごとの完全なエラー メッセージは次のとおりです。

NHibernate.PropertyValueException: Error dehydrating property v  alue for C3.DataModel.CFAPTransaction.Vendor --->

NHibernate.HibernateException: プロパティを解決できません: NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) の NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) の NHibernate.Persister.Entity.AbstractEntityPersister の APVendorId。 GetPropertyValue(Object obj, String propertyName, EntityMode entityMode) at NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) at NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, ISessionImplementorセッション) NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (オブジェクト id、オブジェクト [] フィールド、オブジェクト rowId、ブール [] includeProperty、ブール [] [] includeColumns、Int32 テーブル、IDbCommand ステートメント、ISessionImplementor セッションで、Int32 index) --- 内部例外スタック トレースの終了 --- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32テーブル、IDbCommand ステートメント、ISessionImplementor セッション、Int32 インデックス) を NHibernate で使用します。 Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityInsertAction.Execute() at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) at NHibernate.Engine.ActionQueue NHibernate.Engine.ActionQueue の .ExecuteActions(IList リスト)。NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource セッション) での ExecuteActions() NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent イベント) で) C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 の C3.WebUI.Areas.Finance.Controllers.AccountsPayableController の C3.DataModel.Repositories.NHUnitOfWork.Save()。 C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434 の CreatePayment(CreatePaymentModel モデル)C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line の C3.DataModel.Repositories.NHUnitOfWork.Save() での NHibernate.Transaction.AdoTransaction.Commit() での SessionImpl.Flush() C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434 の C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel モデル) の 2659C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line の C3.DataModel.Repositories.NHUnitOfWork.Save() での NHibernate.Transaction.AdoTransaction.Commit() での SessionImpl.Flush() C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434 の C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel モデル) の 2659

更新 NHibernate を DEBUG モードにすると、次のようなメッセージが表示されます。

Areas.Finance.Controllers.AccountsPayableController エラー C3.WebUI.Areas.Finance.Controllers.AccountsPayableController: 追加情報はありません。NHibernate.PropertyValueException: C3.DataModel.CFAPTransaction.Vendor のプロパティ値の脱水エラー ---> NHibernate.HibernateException: プロパティを解決できません: NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) の NHibernate.Tuple.Entity の APVendorId NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj, String propertyName, EntityMode entityMode) の .AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) の NHibernate.Type .ManyToOneType.NullSafeSet(IDbCommand st, オブジェクト値, Int32 インデックス,

データベースのクエリ時にこれが発生しているようには見えません。一連のオブジェクトを作成し、それらを関連付け、それらを永続化しようとすると問題があると感じていますが、それは純粋な推測です。

4

6 に答える 6

19

nhibernate がエラーの正しいプロパティを表示していない可能性があります。マッピング ファイルの隣接するプロパティを確認し、データベースのデータ型と .net のデータ型の関係にエラーがないか、またはプロパティで繰り返される列を探します...これも確認してくださいリンクFluent NHibernate - IndexOutOfRange

于 2012-06-05T20:17:47.757 に答える
1

同じエラーが発生しました。これは私のサンプルマッピングです:

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); });
Property(x => x.intPersonID, map => map.Column("PersonID"));

プロパティのみを入力してnullintPersonIDを作成することにより、これをデータベースに永続化/保存しようとすると、すべてのプロパティで脱水エラーが発生します!objPerson

私がデータを入力しているのは、データベースに保存する前にintPersonIDデータベースにクエリを実行して を取得するのを防ぐためです。objPerson残念ながら、エラーが発生するため、マッピングを変更して次のように修正しました。

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); });

または、オブジェクト全体を取得してデータベースへのクエリを防止したい場合は、代わりに次のマッピングを使用します。

Property(x => x.intPersonID, map => map.Column("PersonID"));

しかし、それらを組み合わせることはできません。

于 2017-09-12T08:57:56.530 に答える
0

私の場合、例外はエラーの原因となったプロパティを正確に特定することでした。cascade定義のない多対 1 のプロパティがありました。"save-update"エラーを防ぎます:

<many-to-one name="FocusType" cascade="save-update"
    class="MyInfrastructure.FocusType, MyInfrastructure">
    <column name="FocusTypeId" sql-type="int" not-null="false" />
</many-to-one>
于 2019-03-25T19:41:45.257 に答える