24

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

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

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

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

更新

根据请求,这是完整的错误消息:

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

NHibernate.HibernateException:无法解析属性:NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) 的 NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) 在 NHibernate.Persister.Entity.AbstractEntityPersister 的 APVendorId。在 NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, ISessionImplementor 的 NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) session) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand 语句, ISessionImplementor session,Int32 index) --- 内部异常堆栈跟踪结束 --- 在 NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 NHibernate 的 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) 的表,IDbCommand 语句,ISessionImplementor 会话,Int32 索引)。 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 NHibernate.Engine.ActionQueue 中的 .ExecuteActions(IList 列表)。ExecuteActions() 在 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource 会话) 在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件) 在 NHibernate.Impl.SessionImpl.Flush() 在 NHibernate.Transaction.AdoTransaction.Commit( ) 在 C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:C3.WebUI.Areas.Finance.Controllers.AccountsPayableController 中的 C3.DataModel.Repositories.NHUnitOfWork.Save() 中的第 2659 行。 C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434 中的 CreatePayment(CreatePaymentModel 模型)SessionImpl.Flush() 在 NHibernate.Transaction.AdoTransaction.Commit() 在 C3.DataModel.Repositories.NHUnitOfWork.Save() 在 C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 在 C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel 模型)在 C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434SessionImpl.Flush() 在 NHibernate.Transaction.AdoTransaction.Commit() 在 C3.DataModel.Repositories.NHUnitOfWork.Save() 在 C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 在 C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel 模型)在 C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

更新 将 NHibernate 投入调试模式,我得到一堆这样的东西:

Areas.Finance.Controllers.AccountsPayableController 错误 C3.WebUI.Areas.Finance.Controllers.AccountsPayableController:没有其他信息。NHibernate.PropertyValueException:为 C3.DataModel.CFAPTransaction.Vendor 脱水属性值时出错 ---> NHibernate.HibernateException:无法解析属性:NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) 在 NHibernate.Tuple.Entity 的 APVendorId .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,对象值,Int32 索引,

查询数据库时似乎不会发生这种情况。我有一种感觉,我创建一堆对象,关联它们,然后尝试持久化它们有问题,但这是一个纯粹的猜测。

4

6 回答 6

19

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

于 2012-06-05T20:17:47.757 回答
3

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

public CFAPTransactionMap()
{
  HasOne(x => x.Vendor).ForeignKey("VendorId").Cascade.All();
  ...
}
于 2014-04-09T10:53:26.007 回答
3

就我而言,这是 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 列

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

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

CREATE TABLE EMPLOYEE
(
    ID int NOT NULL IDENTITY(0, 1)
);
于 2017-01-27T09:11:45.983 回答
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"));

但是将它们结合起来是不可能的。

于 2017-09-12T08:57:56.530 回答
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>
于 2019-03-25T19:41:45.257 回答
-1

一个聪明的人曾经告诉我把这个添加到我的地图中

.Length(int.MaxValue);
于 2020-02-10T14:56:13.647 回答