2012-06-03 9 views
18

Estoy haciendo una transacción NHibernate bastante compleja en un sistema financiero, creando un pago, registrando las entradas del libro mayor, comprobando si el pago es el monto total de una factura, si es así, marcando la factura como pagada en su totalidad, etc. ... muchas cosas divertidas. Naturalmente, tiene que suceder dentro de una sola transacción.NHibernate: propiedad de deshidratación de error - ¿Qué diablos es esto?

Cuando intento para confirmar el cambio de la sesión, me sale el siguiente error:

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

googlear este no se presentó a muchos registros. ¿Puede alguien decirme qué significa esto y dónde debo enfocar mis esfuerzos de depuración?

ACTUALIZACIÓN

Por la petición, aquí está el mensaje completo de error:

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

NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.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, Object value, Int32 index, Boolean[] settable, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) --- End of inner exception stack trace --- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.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.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) at NHibernate.Impl.SessionImpl.Flush() at NHibernate.Transaction.AdoTransaction.Commit() at C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

ACTUALIZACIÓN Lanzar NHibernate en modo de depuración, me sale un montón de cosas como esta:

processing cascade 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 done processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener ERROR Could not synchronize database state with session NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.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, Object value, Int32 index, Boolean[] settable, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) --- End of inner exception stack trace --- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.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.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) C3.WebUI.Areas.Finance.Controllers.AccountsPayableController ERROR C3.WebUI.Areas.Finance.Controllers.AccountsPayableController: No additional information. NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.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, Object value, Int32 index, Boolean[] settable, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) --- End of inner exception stack trace --- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.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.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) at NHibernate.Impl.SessionImpl.Flush() at NHibernate.Transaction.AdoTransaction.Commit() at C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

Parece que esto no está ocurriendo cuando quer ying la base de datos. Tengo la sensación de que tiene problemas para crear un grupo de objetos, relacionarlos y luego tratar de persistir, pero eso es pura conjetura.

+0

¿Cuál es la excepción completa, y hay una excepción interna? –

+0

¿qué pasa con ** No se puede resolver la propiedad: APVendorId ** - ¿Eso le da una pista? ¿El mapeo está mal? El 'NHUnitOfWork.Save()' está intentando escribir en una columna y está buscando una Propiedad llamada APVendorId. –

+0

No parece * estar * incorrecto. Los repositorios individuales parecen funcionar correctamente. El esquema generado parece correcto. –

Respuesta

14

Es probable que nhibernate no muestre la propiedad de error correcta, compruebe las propiedades adyacentes en el archivo de correlación, busque errores en la relación entre tipos de datos de su base de datos y tipos de datos de .NET o columnas repetidas en propiedades. también verifique este enlace Fluent NHibernate - IndexOutOfRange

+4

Esto es aparentemente lo que sucedió. Tuve un error tipográfico en una propiedad diferente y creo que afectó a esta. No tendría un problema con esto, excepto que el mensaje era tan enloquecedor críptico. –

+2

No es críptico, solo mira la excepción interna en la información que pegaste. –

+0

Um ... no, al ver esto sucediendo 6 años después, sigue siendo críptico y un horrible mensaje de error. –

3

Debe verificar el mapeo CFAPTransaction, parece que quería especificar un proveedor para cada transacción. En este caso, su mapeo debe ser como el siguiente código.

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

En mi caso, faltaba una especificación de identidad en el servidor SQL.

objeto simple:

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

Mapping:

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

SQL:

Aquí está la columna de la identificación con la restricción de clave primaria.

ID column with constraint

y aquí se puede ver la falta de identidad especificación, lo que está causando el problema. Missing Identity Specification

Para resolver el problema, tiene que especificar la columna ID como IDENTITY decir

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

¡Guau, también me lo perdí, gracias! =) –

0

me encontré con el mismo error.Se trata de mis asignaciones de muestra:

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

Si tratara de persistir/guardar esto en mi base de datos rellenando sólo la propiedad intPersonID y haciendo que la nula objPerson, esto va a desencadenar el error de deshidratación en todas sus propiedades!

La razón por la que acabo de llenar intPersonID es para evitar que la base de datos obtenga el objPerson antes de guardar en la base de datos. Por desgracia, se disparará un error, por lo que he modificado mis asignaciones y corregido con esto:

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

O si quiero evitar que la consulta en la base de datos por conseguir el objeto entero, voy a utilizar este mapeo en su lugar:

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

Pero combinarlos no es posible.

Cuestiones relacionadas