2012-06-03 5 views
18

私は金融システムでかなり複雑なNHibernateトランザクションを行っています。支払いを作成し、元帳のエントリを記録し、支払いが請求書の合計金額かどうかを確認します。 ...たくさんの楽しいもの。当然のことながら、1回のトランザクション内で発生する必要があります。NHibernate:脱水特性のエラー - これは一体何ですか?

私はセッションへの変更をコミットしようとすると、私は次のエラーを取得する:これをグーグルで

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

は多くのレコードを上げませんでした。誰かがこれが何を意味しているのか、デバッグ作業に集中する必要があるのか​​教えていただけますか?

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

NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.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 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at 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.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() at C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

UPDATE DEBUGモードにNHibernateはを投げる が、私はこのようなものの束を得る:

UPDATE要求パー

は、ここで完全なエラーメッセージです。

processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: C3.DataModel.APVendor cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: C3.DataModel.APVendor.Transactions done cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: C3.DataModel.APVendor.Transactions done processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener ERROR Could not synchronize database state with session NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.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 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at 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.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) C3.WebUI.Areas.Finance.Controllers.AccountsPayableController ERROR C3.WebUI.Areas.Finance.Controllers.AccountsPayableController: No additional information. NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.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 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at 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.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() at C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

これはクエーカーデータベースを作成する。私は、それは私にオブジェクトの束を作成し、それらを関連づけて、そしてそれらを保持しようとしている問題を持っているという気持ちがありますが、それは純粋な推測です。

+0

完全例外とは何ですか?内部例外がありますか? –

+0

何について**不動産を解決できません:APVendorId ** - それはあなたに手がかりを与えますか?マッピングは間違っていますか? 'NHUnitOfWork.Save()'は列に書き出しようとしていて、APVendorIdという名前のPropertyを探しています。 –

+0

これは間違っているように見えません。個々のリポジトリは適切に実行され構築されているようです。生成されたスキーマは正しいようです。 –

答えて

14

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

+4

これは明らかに何が起こったかです。私は別のプロパティでタイプミスがあり、これがこのプロパティに影響を与えたと思います。私は、このメッセージがあまりにも恐ろしい秘密だったことを除いて、この問題はないでしょう。 –

+2

それは秘密ではありません - あなたがペーストした情報の内側の例外を見てください。 –

+0

ええええええええええ、これを6年後に見ても、それはまだわかりにくく、恐ろしいエラーメッセージです。 –

3

CFAPTransactionマッピングをチェックする必要があります。トランザクションごとにベンダーを1つ指定すると思われます。この場合、マッピングは次のコードのようにする必要があります。

public CFAPTransactionMap() 
{ 
    HasOne(x => x.Vendor).ForeignKey("VendorId").Cascade.All(); 
    ... 
} 
2

私の場合、SQL ServerにはIDの指定がありませんでした。

シンプルオブジェクト:

public class Employee 
{ 
    public virtual int ID { get; set; } 
} 

マッピング:

public class EmployeeMap : ClassMapping<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.ID, map => { map.Generator(Generators.Identity); map.UnsavedValue(0); }); 
    } 
} 

SQL:ここ

は、主キー制約を持つID列です。

ID column with constraint

そしてここで、あなたが問題を引き起こしている行方不明のアイデンティティの仕様を、見ることができます。 Missing Identity Specification

は、問題を解決するために、私は同じエラーが発生しましたIDENTITY すなわち

CREATE TABLE EMPLOYEE 
(
    ID int NOT NULL IDENTITY(0, 1) 
); 
+0

うわー、あまりにもそれを逃した、ありがとう! =) –

0

としてID列を指定する必要があります。これは私のサンプルのマッピングです:

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

私は唯一のプロパティ​​を投入し、objPersonヌルを作ることによって、私のデータベースでこれを保存/持続しようとした場合、これはすべてのあなたの特性上、脱水エラーがトリガされます!

​​を入力したのは、データベースに保存してからobjPersonを取得してデータベースに保存することを防ぐためです。残念ながら、それはエラーがトリガされますので、私は私のマッピングを変更し、これを用いて補正:

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

または私はオブジェクト全体を取得することにより、データベースに照会しないようにしたい場合は、私はだけではなく、このマッピングを使用します。

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

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

関連する問題