Pregunta sobre nhibernate, c# – NHibernate: propiedad de deshidratación de error: ¿Qué diablos es esto?

18

Estoy realizando una transacción NHibernate bastante compleja en un sistema financiero, creando un pago, registrando las entradas del libro mayor, verificando si el pago es el monto total de una factura, si marca la factura como pagada en su totalidad, etc. .Muchas cosas divertidas. Naturalmente, tiene que suceder dentro de una sola transacción.

Cuando intento confirmar el cambio en la sesión, aparece el siguiente error:

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

Googlear esto no dio lugar a muchos récords. ¿Alguien puede decirme qué significa esto y dónde debo enfocar mis esfuerzos de depuración?

ACTUALIZAR

Por solicitud, aquí está el mensaje de error completo:

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

NHibernate.HibernateException: No se puede resolver la propiedad: APVendorId en NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex (Cadena del GetPropertyValue (Object obj, String propertyName, EntityMode entityMode) en NHibernate.Type.EntityType.GetIdentifier (Object value, ISessionImplementor session) en NHibernate.stype.png. sesión) en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto], ObjetoIdId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, IDbCommand sentencia, ISessionImplementor session, índice de Int32) - - Fin del seguimiento de la pila de excepción interna --- en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto [], ID de fila de objeto, Boolea n [] includeProperty, Boolean [] [] includeColumns, tabla Int32, instrucción IDbCommand, sesión ISessionImplementor, índice Int32) en NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object id, Object [] fields, Boolean [] notNull, Int32 j , SqlCommandInfo sql, Object obj, ISessionImplementor session) en los campos NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object id, Object [] fields, Object obj, ISessionImplementor session) y los comentarios de los equipos de conveniencia. ActionQueue.Execute (ejecutable de IExecutable) en NHibernate.Engine.ActionQueue.ExecuteActions (lista de IList) en NHibernate.Engine. DefaultFlushEventListener.OnFlush (Evento FlushEvent) en NHibernate.Impl.SessionImpl.Flush () en NHibernate.Transaction.AdoTransaction.Commit () en C3.DataModel.Repositories.NHUnitOfWork.Save () en C: Dp. taModel.Generated \ Generated \ NHibernateRepositories.generated.cs: line 2659 en C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment (CreatePaymentModel model) en C: \ projects \ C3 \ C3.WebII \ Areas \ Finanzas / Cuestiones AccountsPayableController.cs: línea 434

ACTUALIZAR Al lanzar NHibernate en modo DEBUG, obtengo un montón de cosas como esta:

procesamiento en cascada de la naturaleza de la Cibernación.Cascarilla de recargo de la actividad de la naturaleza de la Cacabeza.Cascarilla de recreo de la embarcación de la naturaleza de la Cacabeza.accesión de la embarcación de la naturaleza de la Cacabeza de la naturaleza de la Cacabeza. APVendor.Transactions procesado en cascada NHibernate.Engine.CascadingAction + EventPlactationCreativoEccceso en el estado de la embarcación de la embarcación en el aire de la naturaleza. Proveedor ---> NHibernate.HibernateException: No se puede resolver la propiedad: APVendorId en NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex (nombre de grupo) .Entity.AbstractEntityPersister.GetProp ertyValue (Object obj, String propertyName, EntityMode entityMode) en NHibernate.Type.EntityType.GetIdentifier (Object value, ISessionImplementor session) en NHibernate.Type. sesión) en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto], ObjetoIdId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, IDbCommand sentencia, ISessionImplementor session, índice de Int32) - - Fin del seguimiento de la pila de excepción interna --- en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto [], ObjetoId de fila, [Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, declaración IDbCommand, ISessionImplementor session, índice de Int32) en NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Id. De objeto, campos [Objeto [], Booleano [] no Nulo, Int32 j, SqlCommandInfo sql, Objeto obj, ISessionImplementor sesion) en NHiberna te.Persister.Entity.AbstractEntityPersister.Insert (Id. de objeto, Objetos [], Objeto obj, sesión de ISessionImplementor) en NHibernate.Action.EntityInsertAction.Execute (IExecutable). .ActionQueue.ExecuteActions (lista de IList) en NHibernate.Agstract.Active.Active.Active.Action.Action.Action.Active.Action.Action.Action.Action.Active.Active.Action.Action.Action.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Active.Alta.Emp. Finance.Controllers.AccountsPayableController: No hay información adicional. NHibernate.PropertyValueException: Error al deshidratar el valor de la propiedad para C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: No se puede resolver la propiedad: VVendorIgualidad de los animales en el que se encuentra. .AbstractEntityTuplizer.GetPropertyValue (entidad del objeto, string string propertyPath) en NHibernate.Persister.Entity.AbstractEntityPersister. .ManyToOneType.NullSafeSet (IDbCommand st, Object value, Int32 index, Boolean [] settable, ISessionImplementor session) en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, Object rowId, Beansean] [] [] includeColumns, tabla Int32, declaración IDbCommand, sesión ISessionImplementor, índice Int32) --- Fin del seguimiento de la pila de excepción interna --- at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Id. de objeto, Objetos [], ObjetoId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) en NHibernate.Perspins .Entity.AbstractEntityPersister.Insert (Id. De objeto, campos [Objeto [], Booleano [] no, Nulo, Int32 j, SqlCommandInfo sql, Objeto obj, ISessionImplementor session) en NHibernate.Persister.EnbityEntityPersister.Insert (Objetos)] , Object obj, ISessionImplementor session) en NHibernate.Action.EntityInsertAction.Execute () en NHibernate.Engine.ActionQueue.Execute (IExecutable, tipo de servicio de usuario), en el caso de NHibernate.Engine.ActionQueue.ExecuteActions. ) en NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (sesión de IEventSource) en NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (evento FlushEvent) en NHibernate.Impl.SessionImage.plush nate.Transaction.AdoTransaction.Commit () en C3.DataModel.Repositories.NHUnitOfWork.Save () en C: \ projects \ C3 \ C3.DataModel.Generated \ Generated \ NHibernateRepositories.generated.cs: línea 2659 en C3.WebIII. Areas.Finance.Controllers.AccountsPayableController.CreatePayment (modelo CreatePaymentModel) en C: \ projects \ C3 \ C3.WebUI \ Areas \ Finance \ Controllers \ AccountsPayableController.cs: línea 434

No parece que esto esté ocurriendo al consultar la base de datos. Tengo la sensación de que tiene problemas al crear un grupo de objetos, relacionarlos y luego tratar de persistir en ellos, pero eso es solo una suposición.

Esto es 3.2, no fluido. Jeremy Holovacs
¿Qué versión de NHibernate es esta? Hay varios problemas en NH 2.0 con el proveedor de Linq y varios tipos de mapeo (es decir, componente). Michael Baker
¿Cuál es la excepción completa, y hay una excepción interna? Preet Sangha
No lo haceparecer estar equivocado. Los repositorios individuales parecen funcionar y construir adecuadamente. El esquema generado parece correcto. Jeremy Holovacs

Tu respuesta

4   la respuesta
14

Es probable que nhibernate no muestre la propiedad correcta de error, verifique las propiedades adyacentes en el archivo de mapeo, busque errores en la relación entre los tipos de datos de su base de datos y los tipos de datos de .net o columnas repetidas en las propiedades ... también verifique esto enlazarFluido NHibernate - IndexOutOfRange

Um ... no, viendo esto después de 6 años, sigue siendo un mensaje de error horrible y críptico. Jeremy Holovacs
No es críptico, solo mire la excepción interna en la información que pegó. Piotr Szmyd
Esto es aparentemente lo que pasó. Tuve un error tipográfico en una propiedad diferente y supongo que afectó a esta. No tendría ningún problema con esto, excepto que el mensaje era tan críptico. Jeremy Holovacs
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; }
}

Cartografía:

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

SQL:

Aquí está la columna de ID con la restricción de clave principal.

Y aquí puede ver la especificación de identidad que falta, lo que está causando el problema.

Para resolver el problema, debe especificar la columna de ID comoIDENTITY es decir

CREATE TABLE EMPLOYEE
(
    ID int NOT NULL IDENTITY(0, 1)
);
Wow, también lo perdí, gracias! =) Frerk Morrin
1

Me encontré con el mismo error. Esta es mi muestra de mapeos:

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

Si intenté persistir / guardar esto en mi base de datos rellenando solo la propiedadintPersonID y haciendo elobjPerson nulo, esto provocará el error de deshidratación en todas sus propiedades!

La razón por la que acabo de poblarintPersonID es evitar la consulta en la base de datos para obtener elobjPerson Antes de guardar en la base de datos. Desafortunadamente, provocará un error, así que modifiqué mis asignaciones y las corregí con esto:

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

O si quiero evitar que se realicen consultas en la base de datos obteniendo todo el objeto, solo usaré esta asignación en su lugar:

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

Pero combinarlos no es posible.

En mi caso, tenía que persistir en la entidad principal sin el elemento secundario, por lo que al agregar la marca ReadOnly de la parte de muchos a uno de la relación funcionó como en:stackoverflow.com/a/33253799/97471 Gerardo Grignoli
3

Debe verificar la asignación de CFAPTransaction. Parece que desea especificar un proveedor para cada transacción. En este caso, su asignación debe ser como el código de abajo.

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

Preguntas relacionadas