NHibernate: Erreur de la déshydratation de la propriété - Que diable est-ce?
Je suis en train de faire une assez complexe NHibernate de transaction dans le système financier, la création d'un paiement, l'enregistrement des écritures comptables, la vérification pour voir si le paiement est le montant total d'une facture, si le marquage de la facture comme payée dans son intégralité, etc... beaucoup de choses amusantes. Naturellement, il doit se passer à l'intérieur d'une transaction unique.
Quand j'essaie de valider la modification de la session, j'obtiens l'erreur suivante:
Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor
Googler cela n'a pas beaucoup de record. Quelqu'un peut me dire ce que cela signifie et où je dois concentrer mes efforts de débogage?
Mise à JOUR
Par demande, voici le message d'erreur complet:
NHibernate.PropertyValueException: Error dehydrating property v alue for C3.DataModel.CFAPTransaction.Vendor --->
NHibernate.HibernateException: Impossible de résoudre la propriété: APVendorId
au NHibernate.N-uplet.De l'entité.EntityMetamodel.GetPropertyIndex(String
propertyName) à
NHibernate.N-uplet.De l'entité.AbstractEntityTuplizer.GetPropertyValue () (Objet
entité, Chaîne propertyPath) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.GetPropertyValue () (Objet
obj, String propertyName, EntityMode entityMode) à
NHibernate.Type.EntityType.GetIdentifier(la valeur de l'Objet,
ISessionImplementor session) à
NHibernate.Type.ManyToOneType.NullSafeSet () (IDbCommand st, la valeur de l'Objet,
Int32 index, Boolean[] réglable, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) --- Fin de l'exception interne
trace de la pile --- à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Boolean[] notNull, Int32 j, SqlCommandInfo sql,
Objet obj, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Object obj, ISessionImplementor session) à
NHibernate.D'Action.EntityInsertAction.Execute() à
NHibernate.Moteur.ActionQueue.Execute(IExecutable exécutable) à
NHibernate.Moteur.ActionQueue.ExecuteActions(IList liste) à
NHibernate.Moteur.ActionQueue.ExecuteActions() à
NHibernate.De l'événement.Par défaut.AbstractFlushingEventListener.PerformExecutions(IEventSource
session) à
NHibernate.De l'événement.Par défaut.DefaultFlushEventListener.OnFlush(FlushEvent
de l'événement) à NHibernate.Impl.SessionImpl.Flush() à
NHibernate.Des transactions.AdoTransaction.Commit() à
C3.DataModel.Les référentiels.NHUnitOfWork.Save() dans
C:\projets\C3\C3.DataModel.Généré\Généré\NHibernateRepositories.généré.cs:ligne
2659 à
C3.L'interface utilisateur web.Les zones.Finances.Les contrôleurs.AccountsPayableController.CreatePayment(CreatePaymentModel
modèle)
C:\projets\C3\C3.WebUI\Zones\Finance\Controllers\AccountsPayableController.cs:ligne
434
Mise à JOUR
Jeter NHibernate en mode DEBUG, je reçois un tas de trucs de ce genre:
de traitement de la cascade
NHibernate.Moteur.CascadingAction+SaveUpdateCascadingAction pour:
C3.DataModel.APVendor
cascade de NHibernate.Moteur.CascadingAction+SaveUpdateCascadingAction pour
collection: C3.DataModel.APVendor.Les Transactions
fait cascade de NHibernate.Moteur.CascadingAction+SaveUpdateCascadingAction pour
collection: C3.DataModel.APVendor.Les Transactions
fait de traitement de la cascade de NHibernate.Moteur.CascadingAction+SaveUpdateCascadingAction pour:
C3.DataModel.APVendor
NHibernate.De l'événement.Par défaut.AbstractFlushingEventListener ERREUR: impossible de synchroniser la base de données d'état de session
NHibernate.PropertyValueException: Erreur de déshydratation valeur de la propriété pour C3.DataModel.CFAPTransaction.Vendeur --->
NHibernate.HibernateException: Impossible de résoudre la propriété: APVendorId
au NHibernate.N-uplet.De l'entité.EntityMetamodel.GetPropertyIndex(String
propertyName) à
NHibernate.N-uplet.De l'entité.AbstractEntityTuplizer.GetPropertyValue () (Objet
entité, Chaîne propertyPath) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.GetPropertyValue () (Objet
obj, String propertyName, EntityMode entityMode) à
NHibernate.Type.EntityType.GetIdentifier(la valeur de l'Objet,
ISessionImplementor session) à
NHibernate.Type.ManyToOneType.NullSafeSet () (IDbCommand st, la valeur de l'Objet,
Int32 index, Boolean[] réglable, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) --- Fin de l'exception interne
trace de la pile --- à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Boolean[] notNull, Int32 j, SqlCommandInfo sql,
Objet obj, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Object obj, ISessionImplementor session) à
NHibernate.D'Action.EntityInsertAction.Execute() à
NHibernate.Moteur.ActionQueue.Execute(IExecutable exécutable) à
NHibernate.Moteur.ActionQueue.ExecuteActions(IList liste) à
NHibernate.Moteur.ActionQueue.ExecuteActions() à
NHibernate.De l'événement.Par défaut.AbstractFlushingEventListener.PerformExecutions(IEventSource
session)
C3.L'interface utilisateur web.Les zones.Finances.Les contrôleurs.AccountsPayableController ERREUR C3.L'interface utilisateur web.Les zones.Finances.Les contrôleurs.AccountsPayableController:
Aucune information supplémentaire.
NHibernate.PropertyValueException: Erreur de déshydratation valeur de la propriété pour C3.DataModel.CFAPTransaction.Vendeur --->
NHibernate.HibernateException: Impossible de résoudre la propriété: APVendorId
au NHibernate.N-uplet.De l'entité.EntityMetamodel.GetPropertyIndex(String
propertyName) à
NHibernate.N-uplet.De l'entité.AbstractEntityTuplizer.GetPropertyValue () (Objet
entité, Chaîne propertyPath) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.GetPropertyValue () (Objet
obj, String propertyName, EntityMode entityMode) à
NHibernate.Type.EntityType.GetIdentifier(la valeur de l'Objet,
ISessionImplementor session) à
NHibernate.Type.ManyToOneType.NullSafeSet () (IDbCommand st, la valeur de l'Objet,
Int32 index, Boolean[] réglable, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) --- Fin de l'exception interne
trace de la pile --- à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Déshydrater(Objet
id, Object[] champs, Objet rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32 table, IDbCommand déclaration,
ISessionImplementor session, Int32 index) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Boolean[] notNull, Int32 j, SqlCommandInfo sql,
Objet obj, ISessionImplementor session) à
NHibernate.Persister.De l'entité.AbstractEntityPersister.Insert(id de l'Objet,
Object[] champs, Object obj, ISessionImplementor session) à
NHibernate.D'Action.EntityInsertAction.Execute() à
NHibernate.Moteur.ActionQueue.Execute(IExecutable exécutable) à
NHibernate.Moteur.ActionQueue.ExecuteActions(IList liste) à
NHibernate.Moteur.ActionQueue.ExecuteActions() à
NHibernate.De l'événement.Par défaut.AbstractFlushingEventListener.PerformExecutions(IEventSource
session) à
NHibernate.De l'événement.Par défaut.DefaultFlushEventListener.OnFlush(FlushEvent
de l'événement) à NHibernate.Impl.SessionImpl.Flush() à
NHibernate.Des transactions.AdoTransaction.Commit() à
C3.DataModel.Les référentiels.NHUnitOfWork.Save() dans
C:\projets\C3\C3.DataModel.Généré\Généré\NHibernateRepositories.généré.cs:ligne
2659 à
C3.L'interface utilisateur web.Les zones.Finances.Les contrôleurs.AccountsPayableController.CreatePayment(CreatePaymentModel
modèle)
C:\projets\C3\C3.WebUI\Zones\Finance\Controllers\AccountsPayableController.cs:ligne
434
Il ne semble pas ce qui se passe lors de l'interrogation de la base de données. J'ai le sentiment qu'il a des problèmes avec moi à créer un tas d'objets, en les reliant, et d'essayer ensuite de les conserver, mais c'est une pure supposition.
- Quelle est la pleine exception, et s'il y a une exception interne?
- qu'en est Incapable de résoudre la propriété: APVendorId, est - ce que vous donner un indice? La cartographie est mal? Le
NHUnitOfWork.Save()
est en train d'essayer d'écrire dans une colonne et est à la recherche d'une Propriété appelée APVendorId. - Il ne semble pas être mauvais. L'individu dépôts semblent à réaliser et construire correctement. Le schéma généré semble correcte.
- Essayez de mettre un générateur de profils SQL et aussi l'augmentation de la journalisation dans NHibernate. Je trouve que la plupart des problèmes avec NHiberate sont résolus à l'aide d'indices, il est étonnant d'enregistrement (log4net). Voir ce que SQL est généré et ce NHiberate attend..
- Si c'est le cas, je voudrais réduire la taille du graphe de la save jusqu'à ce qu'il fonctionne et de travailler vers l'arrière. En cas d'échec - j'ai peut-être même l'nhibernate la source. Mais à ce stade, si tout ce que vous faites est de créer un graphe d'objets, alors il pourrait être temps pour simplifier graphique et de s'essayer à un peu de temps.
- Quelle est la version de NHibernate est-ce? Il y a diverses questions dans NH 2.0 avec le fournisseur Linq et les différents types de projection (c'est à dire de la composante).
- C'est 3.2, non fluide.
Vous devez vous connecter pour publier un commentaire.
Il est probable que nhibernate est pas la bonne propriété d'erreur, vérifiez les propriétés adjacentes dans le fichier de mappage, à la recherche d'erreurs dans la relation entre les types de données à partir de votre base de données et types de données .net ou répétée des colonnes dans les propriétés... également consulter ce lien NHibernate Fluent - IndexOutOfRange
Vous devriez vérifier CFAPTransaction de cartographie, Il semble que vous ayez voulu préciser un Vendeur pour chaque transaction. Dans ce cas, votre cartographie doit être comme ci-dessous de code.
Dans mon cas, c'était un manque d'Identité de la Spécification SQL-Server.
Simple objet:
Cartographie:
SQL:
Ici est l'ID de la colonne avec la contrainte de clé primaire.
Et ici vous pouvez voir le manque d'Identité cahier des charges, qui est à l'origine du problème.
Pour résoudre le problème, vous devez spécifier l'ID de la colonne comme
IDENTITY
c'est à dire
J'ai rencontré la même erreur. C'est mon exemple de mappage:
Si j'ai essayé de persister/enregistrer ce sur ma base de données en remplissant seulement la propriété
intPersonID
et de faire leobjPerson
null, cela va déclencher la déshydratation d'erreur sur l'ensemble de vos propriétés!La raison pour laquelle je suis juste le remplissage de
intPersonID
est d'empêcher l'interrogation de la base de données pour obtenir leobjPerson
avant l'enregistrement dans la base de données. Malheureusement, il va déclencher une erreur, j'ai donc modifié mon mappages et corrigé avec cette:Ou si je veux éviter l'interrogation de la base de données par l'obtention de l'objet entier, je vais juste utiliser cette cartographie de la place:
Mais la combinaison n'est pas possible.
Dans mon cas, l'exception a été l'identification exacte de la propriété qui a été la cause de l'erreur. J'ai eu plusieurs-à-une propriété qui manquait un
cascade
définition."save-update"
empêche l'erreur: