2010-01-08 5 views
4

Je suis en train d'importer des fichiers volumineux en utilisant des requêtes de traitement par lots et le traitement des paralel et je suis constamment faire des erreurs commeidentifiant NHibernate exception modifié

NHibernate.HibernateException: identifier of an instance of xxx was altered from ... to ... 

Je sais que je ne suis pas en train de modifier ma clé primaire du tout. J'utilise NH 2.1.x GA, ThreadStaticSessionContext, chaque fichier est traité dans un thread séparé (en utilisant ThreadPool) et les informations contenues dans les fichiers sont sans aucun rapport. J'ai une session et une transaction pour chaque fichier, mais je ne nettoie pas la session du tout. Dans le même fil, je suis en train de commettre la transaction et de fermer la session mais cette erreur m'échappe.

Si vous avez des suggestions ...

Répondre

0

Juste pour fermer, je pense l'erreur est survenue en raison des faibles capacités de codage (en utilisant des ressources partagées couvrant plusieurs threads sans prendre soin de conccurency) et l'identité sur les clés primaires

Il n'y avait pas de place dans le code où j'ai défini ou changé le pr valeurs clés imary par moi-même.

1
  1. Définissez votre propriété ID:

    ID public int {get; ensemble privé; }

    de sorte que vous ne pouvez pas le changer.

  2. Vérifiez que le type d'ID est le même que le type dans la base de données. (Si la base de données a un champ int et vous définissez à champ long puis NHibernate pense que cela a changé.

  3. Si vous utilisez l'identité pour PK, changé pour Salut-Lo ou autre chose. Il y a eu beaucoup de parler de ne pas utiliser l'identité dans SQL Server. dans certaines circonstances, il peut échouer.

+0

Je pense que c'est causé par la clé primaire, l'identité. – DaeMoohn

2

Dans mon cas, j'avais une solution différente au même problème. L'erreur que je voyais était la suivante:

NHibernate.HibernateException: identifiant d'une instance de XXXX a été modifié 9 à 9

Le problème était que j'avais changé l'identifiant (« id » colonne) dans le fichier XML de mappage de "Int64" à "Int32" mais j'ai oublié de passer de la classe de données Int64 à Int32. Cela explique le fait que NHibernate n'a pas pu modifier l'identifiant de "9" avec "9". Le premier "9" était un Int64 mais il attendait un "Int32". J'espère que cela aide quelqu'un.

Questions connexes