我在金融系统中进行相当复杂的NHibernate交易,创建付款,记录分类帐条目,检查付款是否是发票总金额,如果是,则将发票标记为付款完整等等......很多有趣的东西。当然,它必须在一次交易中发生。
当我尝试将更改提交到会话时,出现以下错误:
Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor
谷歌搜索这个并没有出现很多记录。有人能告诉我这意味着什么以及我需要把重点放在调试工作上吗?
更新
根据请求,这是完整的错误消息:
NHibernate.PropertyValueException: Error dehydrating property v alue for C3.DataModel.CFAPTransaction.Vendor --->
NHibernate.HibernateException:无法解析属性:APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(对象 entity,String propertyPath)at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(对象 obj,String propertyName,EntityMode entityMode)at NHibernate.Type.EntityType.GetIdentifier(对象值, ISessionImplementor会议) NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st,Object value, Int32索引,Boolean []可设置,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)---内部异常结束 堆栈跟踪--- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql, 对象obj,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, 对象[]字段,对象obj,ISessionImplementor会话)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 会议)在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件)在NHibernate.Impl.SessionImpl.Flush()at NHibernate.Transaction.AdoTransaction.Commit()at C3.DataModel.Repositories.NHUnitOfWork.Save()in C:\项目\ C3 \ C3.DataModel.Generated \生成\ NHibernateRepositories.generated.cs:行 2659在 C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel 模型) C:\ PROJECTS \ C3 \ C3.WebUI \区\金融\ \控制器AccountsPayableController.cs:行 434
更新 把NHibernate扔进DEBUG模式,我得到了很多这样的东西:
处理级联 NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction: C3.DataModel.APVendor 级联NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction for 集合:C3.DataModel.APVendor.Transactions 完成级联NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction for 集合:C3.DataModel.APVendor.Transactions 完成处理级联NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction for: C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener错误无法使数据库状态与会话同步 NHibernate.PropertyValueException:使C3.DataModel.CFAPTransaction.Vendor --->的属性值脱水错误 NHibernate.HibernateException:无法解析属性:APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(对象 entity,String propertyPath)at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(对象 obj,String propertyName,EntityMode entityMode)at NHibernate.Type.EntityType.GetIdentifier(对象值, ISessionImplementor会议) NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st,Object value, Int32索引,Boolean []可设置,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)---内部异常结束 堆栈跟踪--- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql, 对象obj,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, 对象[]字段,对象obj,ISessionImplementor会话)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 会话) C3.WebUI.Areas.Finance.Controllers.AccountsPayableController错误C3.WebUI.Areas.Finance.Controllers.AccountsPayableController: 没有其他信息。 NHibernate.PropertyValueException:使C3.DataModel.CFAPTransaction.Vendor --->的属性值脱水错误 NHibernate.HibernateException:无法解析属性:APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(对象 entity,String propertyPath)at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(对象 obj,String propertyName,EntityMode entityMode)at NHibernate.Type.EntityType.GetIdentifier(对象值, ISessionImplementor会议) NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st,Object value, Int32索引,Boolean []可设置,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)---内部异常结束 堆栈跟踪--- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 id,Object [] fields,Object rowId,Boolean [] includeProperty, Boolean [] [] includeColumns,Int32表,IDbCommand语句, ISessionImplementor session,Int32 index)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object [] fields,Boolean [] notNull,Int32 j,SqlCommandInfo sql, 对象obj,ISessionImplementor会话)at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, 对象[]字段,对象obj,ISessionImplementor会话)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 会议)在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件)在NHibernate.Impl.SessionImpl.Flush()at NHibernate.Transaction.AdoTransaction.Commit()at C3.DataModel.Repositories.NHUnitOfWork.Save()in C:\项目\ C3 \ C3.DataModel.Generated \生成\ NHibernateRepositories.generated.cs:行 2659在 C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel 模型) C:\ PROJECTS \ C3 \ C3.WebUI \区\金融\ \控制器AccountsPayableController.cs:行 434
查询数据库时似乎没有出现这种情况。我有一种感觉,我创建一堆对象,关联它们,然后试图坚持它们有问题,但这是一个纯粹的猜测。
答案 0 :(得分:14)
nhibernate可能没有显示错误的正确属性,检查映射文件中的相邻属性,查找数据库中数据类型与.net中的数据类型或属性中重复列之间关系的错误...另请查看此链接Fluent NHibernate - IndexOutOfRange
答案 1 :(得分:3)
您应该检查CFAPTransaction映射,看起来您想为每个事务指定一个供应商。在这种情况下,您的映射必须类似于下面的代码。
public CFAPTransactionMap()
{
HasOne(x => x.Vendor).ForeignKey("VendorId").Cascade.All();
...
}
答案 2 :(得分:2)
就我而言,它是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)
);
答案 3 :(得分: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"));
但是将它们组合起来是不可能的。
答案 4 :(得分:0)
在我的情况下,异常是准确地标识了导致错误的属性。我有一个缺少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>
答案 5 :(得分:0)
一个聪明的人曾经告诉我将其添加到我的地图中
.Length(int.MaxValue);