2010-11-03 2 views
24

Obtenir cela chaque fois que je tente de créer une entité particulière ... Je veux juste savoir comment je devrais aller trouver la cause. J'utilise la mise en correspondance automatique de NHibernate, donc peut-être n'ai-je pas défini une convention de manière appropriée et/ou besoin de redéfinir quelque chose dans un ou plusieurs fichiers de mappage. Je suis passé par un certain nombre de messages sur le web concernant ce problème et j'ai du mal à comprendre exactement pourquoi cela se passe dans mon cas.Comment résoudre "La mise à jour par lots a renvoyé un nombre de lignes inattendu à partir de la mise à jour, nombre de lignes réel: 0; attendu: 1" problème?

L'objet que je sauvegarde est assez simple. C'est un objet "Personne" qui référence une entité "Société" et possède une collection d'entités "Adresse". Les mises à jour fonctionnent correctement sur les objets Person existants qui se trouvent déjà dans la base de données.

Suggestions?

Merci de

Répondre

25

L'erreur signifie que l'instruction SQL INSERT est en cours d'exécution, mais le ROWCOUNT retourné par SQL Server après son exécution est 0, pas 1 comme prévu.

Il existe plusieurs causes, depuis les mappages incorrects, aux déclencheurs UPDATE/INSERT dont la fonction rowcount est désactivée.

Votre meilleur rythme est de profiler les instructions SQL et de voir ce qui se passe. Pour ce faire, activez nHibernate sql logging ou utilisez le profileur sql. Une fois que vous avez le SQL, vous pouvez connaître la cause, sinon essayez d'exécuter le SQL manuellement et voir ce qui se passe.

Aussi, je vous suggère de poster votre cartographie, car il aidera les gens à repérer les problèmes.

+1

Yup. Dans mon cas, j'utilise le framework SharpArchitecture qui met par défaut les valeurs non sauvegardées pour le champ "Id" à zéro ... au lieu de -1 comme je suis habitué à l'utiliser depuis des années. J'ai essayé de surcharger ceci dans ma configuration de mappage automatique et même dans une classe de mappage personnalisée ... mais la définit toujours à 0. – wgpubs

+1

Vous avez donc essayé ceci: Id (a => a.Id) .UnsavedValue (0); Si vous avez encore des problèmes et que vous voulez que je jette un coup d'œil, ajoutez le SQL résultant et votre mapping dans votre question. – Iain

+1

J'ai rencontré ce problème car un objet nul était ajouté à une collection, puis une sauvegarde était en cours. – m4tt1mus

9

Cela peut se produire lorsque des déclencheurs exécutent des requêtes DML (modification de données) supplémentaires qui affectent le nombre de lignes. Ma solution consistait à ajouter ce qui suit en haut de mon déclencheur:

SET NOCOUNT ON; 
0

Cela peut se produire en raison de la clé primaire d'incrémentation automatique. Pour résoudre ce problème, n'insérez pas la valeur d'incrémentation automatique avec l'ensemble de données. Insérer des données sans la clé primaire.

0

Lorsque vous ciblez une vue avec un déclencheur INSTEAD OF, il peut être pratiquement impossible d'obtenir le nombre de lignes correct. Après avoir creusé un peu dans la source, j'ai découvert que vous pouviez créer un persister personnalisé qui fait que NHibernate ignore les vérifications du nombre.

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister 
{ 
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) 
     : base(persistentClass, cache, factory, mapping) 
    { 
     for (int i = 0; i < this.insertResultCheckStyles.Length; i++) 
     { 
      this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.updateResultCheckStyles.Length; i++) 
     { 
      this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.deleteResultCheckStyles.Length; i++) 
     { 
      this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 
    } 
} 
+0

Bonjour, pourriez-vous s'il vous plaît laissez-moi savoir comment vous utilisez cette persister? –

Questions connexes