c# - studio - nhibernate vs entity framework
NHibernate: propiedad de deshidratación de error: ¿Qué diablos es esto? (4)
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 es así, marque la factura como pagada en su totalidad, etc. .Muchas cosas divertidas. Naturalmente, tiene que ocurrir 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 el sitio GetPropertyValue (Object obj, String propertyName, EntityMode entityMode) en NHibernate.Type.EntityType.GetIdentifier (Object value, ISessionImplementor session) en NHibernate.type.png. sesion) en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto], ObjetoIdId, Booleano [] includeProperty, Booleano [] [] includeColumns, tabla Int32, IDbCommand sentencia, ISessionImplementor session, índice de Int32) - - Fin del rastreo 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 otros artículos relacionados con este tema. ActionQueue.Execute (ejecutable de IExecutable) en NHibernate.Engine.ActionQueue.ExecuteActions (lista de IList) en NHibernate.Engine.ActionQue.P.P.P.P.P.P.P. DefaultFlushEventListener.OnFlush (Evento FlushEvent) en NHibernate.Impl.SessionImpl.Flush () en NHibernate.Transaction.AdoTransaction.Commit () en C3.DataModel.Repositories.NHUnitOfWork.Save () en C: / quas.png 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
ACTUALIZACIÓN Al lanzar NHibernate en modo DEBUG, obtengo un montón de cosas como esta:
procesamiento en cascada de la naturaleza de la Cibernación.Agtion.Agtion.Agtion.Action de la actividad de la organización de la naturaleza de la Calla de la Cacerola.Agencia en la Vencedor de la Cacalla de la Vencedor de la Caza de la Vencedor de la Caza de la Vencedor de la Vencedor de la Cacalla de la Vencedor de la Caza del Cacalla APVendor.Transacciones procesadas en cascada NHibernate.Engine.CascadingAction en el que se realiza el ejercicio en el estado de la embarcación. Proveedor ---> NHibernate.HibernateException: No se puede resolver la propiedad: APVendorId en NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex (Vencedor). .Entity.AbstractEntityPersister.GetProp ertyValue (Object obj, String propertyName, EntityMode entityMode) en NHibernate.Type.EntityType.GetIdentifier (Object object, ISessionImplementor session) en NHibernate.Type. sesion) en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (ID de objeto, campos [Objeto], ObjetoIdId, Booleano [] includeProperty, Booleano [] [] includeColumns, tabla Int32, IDbCommand sentencia, ISessionImplementor session, índice de Int32) - - Fin del seguimiento de la pila de excepciones internas --- 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 Int32) en NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Id. De objeto, campos [Objeto [], Booleano [] no, Nulo, Int32 j, SqlCommandInfo sql, Objeto obj, ISessionImplementor session) en NHiberna te.Persister.Entity.AbstractEntityPersister.Insert (Id. de objeto, Objetos [], Objeto objeto, sesión de ISessionImplementor) en NHibernate.Action.EntityInsertAction.Execute (IExecutable). .ActionQueue.ExecuteActions (lista IList) en NHibernate.Engine.ActionQueue.ExecuteActions () en NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (sesión IEventSource) C3.WebUI.Areas.Finance.Controllers.AccountsPayableController C3.WebUI.Areas error. 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 de la que se trata. .AbstractEntityTuplizer.GetPropertyValue (entidad de objeto, string String propertyPath) en NHibernate.Persister.Entity. .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, campos Objeto [], ObjetoIdId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 table, IDbCommand, ISessionImplementor session, Int32 index) en NHibernatePersins .Entity.AbstractEntityPersister.Insert (Id. De objeto, campos [Objeto [], Booleano [] no, Nulo, Int32 j, SqlCommandInfo sql, Objeto obj, ISessionImplementor session) en NHibernate.Persister.EnbityEntityPersister.Insert] , Object obj, sesión de ISessionImplementor) en NHibernate.Action.EntityInsertAction.Execute () en NHibernate.Engine.ActionQueue.Execute (IExecutable, tipo de usuario de un tipo de usuario), en el caso de NHibernate. ) en NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (sesión de IEventSource) en NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (evento FlushEvent) en NHibernate.Impl.SessionImágenes 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 montón de objetos, relacionarlos y luego tratar de persistir en ellos, pero eso es solo una suposición.
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();
...
}
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:
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 ID con la restricción de clave principal.
Y aquí puede ver la especificación de identidad faltante, que está causando el problema.
Para resolver el problema, debe especificar la columna de ID como IDENTITY
es decir,
CREATE TABLE EMPLOYEE
(
ID int NOT NULL IDENTITY(0, 1)
);
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 enlace Fluido NHibernate - IndexOutOfRange
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 al intPersonID
solo la propiedad intPersonID
y hacer que objPerson
nulo, ¡esto desencadenará el error de deshidratación en todas sus propiedades!
La razón por la que simplemente estoy intPersonID
es para evitar que se intPersonID
consultas en la base de datos para obtener el objPerson
antes de guardar en la base de datos. Desafortunadamente, provocará un error, así que modifiqué mis asignaciones y 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.