NHibernate:错误脱水属性 – 这到底是什么?

我正在金融系统中进行相当复杂的NHibernate交易,创建付款,记录分类帐条目,检查付款是否是发票总金额,如果是,则将发票标记为全额付款等。很多有趣的东西。 当然,它必须在单个交易中发生。

当我尝试将更改提交到会话时,我收到以下错误:

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

谷歌搜索这并没有出现很多记录。 有人能告诉我这意味着什么以及我需要在哪里集中调试工作?

UPDATE

每个请求,这是完整的错误消息:

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

NHibernate.HibernateException:无法解析属性:NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)中的NHVendorId NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity,String propertyPath)at NHibernate.Persister.Entity.AbstractEntityPersister。位于NHibernate.Type.ManyToOneType.NullSafeSet的NHibernate.Type.EntityType.GetIdentifier(Object value,ISessionImplementor session)中的GetPropertyValue(Object obj,String propertyName,EntityMode entityMode)(IDbCommand st,Object value,Int32 index,Boolean [] settable,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object [] fields,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32 table,IDbCommand statement,ISessionImplementor session,Int32 index) – – 内部exception堆栈跟踪结束—在NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object []字段,Object rowId,Boolea n [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor会话,Int32索引),位于NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Boolean [] notNull,Int32 j在NHibernate.Engine的NHibernate.Action.EntityInsertAction.Execute()中的NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Object obj,ISessionImplementor session)中的,SqlCommandInfo sql,Object obj,ISessionImplementor session。位于NHibernate.Event.Ection.PerformExecutions(IEventSource会话)的NHibernate.Event.Ection.EecuteActions(NHistnate.Ection.PerformAecutions)的NHibernate.Engine.ActionQueue.ExecuteActions()的NHibernate.Engine.ActionQueue.ExecuteActions(IList列表)中的ActionQueue.Execute(IExecutable可执行文件)。位于C:\ projects \ C3 \ C3.Da的C3.DataModel.Repositories.NHUnitOfWork.Save()的NHibernate.Transaction.AdoTransaction.Commit()处的NHibernate.Impl.SessionImpl.Flush()NHibernate.Impl.SessionImpl.Flush()中的DefaultFlushEventListener.OnFlush(FlushEvent事件) taModel.Generated \ Generated \ NHibernateRepositories.generated.cs:在C:\ projects \ C3 \ C3.WebUI \ Areas \ Finance \ Controllers \中的C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel模型)中的第2659行AccountsPayableController.cs:第434行

更新将 NHibernate抛入DEBUG模式,我得到了一堆这样的东西:

处理级联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完成处理级联NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction:C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener错误无法使数据库状态与会话同步NHibernate.PropertyValueException:错误使C3.DataModel.CFAPTransaction的属性值脱水。供应商—> NHibernate.HibernateException:无法在NHibernate.Persister的NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(对象实体,String propertyPath)中解析NHETEnate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)中的属性:APVendorId .Entity.AbstractEntityPersister.GetProp NHibernate.Type.ManyToOneType.NullSafeSet的NHibernate.Type.EntityType.GetIdentifier(Object value,ISessionImplementor session)中的ertyValue(Object obj,String propertyName,EntityMode entityMode)(IDbCommand st,Object value,Int32 index,Boolean [] settable,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object [] fields,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32 table,IDbCommand statement,ISessionImplementor session,Int32 index) – – 内部exception堆栈跟踪结束—在NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object []字段,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句, NHiberna的NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql,Object obj,ISessionImplementor session)中的ISessionImplementor会话,Int32索引) 在NHibernate.Engine的NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件)的NHibernate.Action.EntityInsertAction.Execute()中的te.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Object obj,ISessionImplementor session) NHibernate.Event.PerformExecutions(IEventSource会话)中的NHibernate.Engine.ActionQueue.ExecuteActions()的.ActionQueue.ExecuteActions(IList list)C3.WebUI.Areas.Finance.Controllers.AccountsPayableController ERROR C3.WebUI.Areas。 Finance.Controllers.AccountsPayableController:没有其他信息。 NHibernate.PropertyValueException:使C3.DataModel.CFAPTransaction.Vendor —> NHibernate.HibernateException的属性值脱水失败:无法解析属性:NHibernate.Tuple.Entity的NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)中的APVendorId位于NHibernate.Type的NHibernate.Type.EntityType.GetIdentifier(对象值,ISessionImplementor会话)的NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj,String propertyName,EntityMode entityMode)中的.AbstractEntityTuplizer.GetPropertyValue(Object entity,String propertyPath) NHMartn.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object [] fields,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor会话,Int32索引)—内部exception堆栈跟踪结束— 在NHibernate.Persister的NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object []字段,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor会话,Int32索引)在NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object []字段中的.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql,Object obj,ISessionImplementor session) NHibernate.Ection中的NHibernate.Ection中的NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件)中的NHibernate.Ection.Ection.Perue.ExecuteActions(例如,对象obj,ISessionImplementor会话)NHibernate.Engine.ActionQueue.Execute( )在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)的NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会话)NHibernate.Impl.SessionImpl.Flush()在NHiber nate.Transaction.AdoTransaction.Commit()位于C:\ projects \ C3 \ C3.DataModel.Generated \ Generated \ NHibernateRepositories.generated.cs中的C3.DataModel.Repositories.NHUnitOfWork.Save()位于C3.WebUI的第2659行。 C:\ projects \ C3 \ C3.WebUI \ Areas \ Finance \ Controllers \ AccountsPayableController.cs:lines 434中的Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model)

查询数据库时似乎没有出现这种情况。 我有一种感觉,我创建一堆对象,关联它们,然后试图坚持它们有问题,但这是一个纯粹的猜测。

nhibernate可能没有显示错误的正确属性,检查映射文件中的相邻属性,查找数据库中数据类型与.net中数据类型或属性中重复列之间关系的错误…也检查这个链接Fluent NHibernate – IndexOutOfRange

您应该检查CFAPTransaction映射,看起来您想为每个事务指定一个供应商。 在这种情况下,您的映射必须类似于下面的代码。

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

就我而言,它是SQL-Server上缺少的身份规范。

简单对象:

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

制图:

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

SQL:

这是具有主键约束的ID列。

带有约束的ID列

在这里,您可以看到缺少的身份规范,这导致了问题。 缺少身份规范

要解决此问题,您必须将ID列指定为IDENTITY ie

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

我遇到了同样的错误。 这是我的示例映射:

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

如果我试图通过仅填充属性intPersonID并使objPerson null来持久保存/保存在我的数据库上,这将触发所有属性的脱水错误!

我刚刚填充intPersonID的原因是为了防止在保存到数据库之前查询数据库以获取objPerson 。 不幸的是,它会触发错误,所以我修改了我的映射并更正了这个:

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

或者如果我想通过获取整个对象来阻止查询数据库,我将只使用此映射:

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

但结合它们是不可能的。