NHibernate:错误脱水属性 - 这到底是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(对象值,ISessionImplementor会话)中的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) - - 内部异常堆栈跟踪结束---在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.Eeine.Ection.PerformExecutions(IEventSource会话)在NHibernate.Event.Event.Default上的NHibernate.Event.ActionQueue.ExecuteActions()的NHibernate.Engine.ActionQueue.ExecuteActions(IList列表)中的ActionQueue.Execute(IExecutable executable)。在NHibernate.Impl.SessionImpl.Flush()的NHibernate.Impl.SessionImpl.Flush()中的DefaultFlushEventListener.OnFlush(FlushEvent事件)位于C: projects C3 C3.Da中的C3.DataModel.Repositories.NHUnitOfWork.Save()的NHibernate.Transaction.AdoTransaction.Commit() 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(Object实体,String propertyPath)中解析属性:NHibernate.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) - - 内部异常堆栈跟踪结束---在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.Devent.AbstractFlushingEventListener.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) NHM的一个.ManyToOneType.NullSafeSet(IDbCommand st,Object value,Int32 index,Boolean [] settable,ISessionImplementor session)NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object [] fields,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor会话,Int32索引)---内部异常堆栈跟踪结束---在NHibernate.Persister的NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id,Object []字段,Object rowId,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32表,IDbCommand语句,ISessionImplementor会话,Int32索引) NHEnate.Persister.Entity.AbstractEntityPersister.Insert(Object id,Object []字段中的.Entity.AbstractEntityPersister.Insert(Object id,Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql,Object obj,ISessionImplementor session) ,对象obj,ISessionImplementor会话)NHibernate.Ection.ActionMueue.ExecuteActions的NHibernate.Engine.ActionQueue.Execute(执行可执行文件)处的NHibernate.Ection.Ection.Ection执行命令处于NHibernate.Ection.Ection.Perue.ExecuteActions的NHibernate.Engine.ActionQueue.Execute(IExecutable executable)。 )在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<Employee>
{
public EmployeeMap()
{
Id(x => x.ID, map => { map.Generator(Generators.Identity); map.UnsavedValue(0); });
}
}
SQL:
这是具有主键约束的ID列。
要解决此问题,您必须将ID列指定为IDENTITY
,即
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
为空来持久保存/保存在我的数据库中,这将触发所有属性的脱水错误!
我只是填充intPersonID
的原因是为了防止在保存到数据库之前查询数据库以获取objPerson
。不幸的是,它会触发错误,所以我修改了我的映射并更正了这个:
ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); });
或者如果我想通过获取整个对象来阻止查询数据库,我将只使用此映射:
Property(x => x.intPersonID, map => map.Column("PersonID"));
但结合它们是不可能的。
在我的例子中,异常是准确地识别导致错误的属性。我有一个多对一的属性缺乏cascade
定义。 "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>
以上是关于NHibernate:错误脱水属性 - 这到底是什么?的主要内容,如果未能解决你的问题,请参考以下文章
java 里面麼 boolean true false 到底是什麼!?