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

时间:2012-06-03 02:07:36

标签: c# nhibernate

我在金融系统中进行相当复杂的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

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

6 个答案:

答案 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 column with constraint

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

要解决此问题,您必须将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);