web-dev-qa-db-fra.com

La réponse à un problème "The update to lot in a replated number of lignes to a number of post to the number; real number of lines: 0; attendu: 1"

Obtenir cela à chaque fois que je tente de CRÉER une entité particulière ... je veux juste savoir comment je devrais m'y prendre pour en déterminer la cause.

J'utilise l'auto-mappage Fluent NHibernate, alors je n'ai peut-être pas défini de convention de manière appropriée et/ou dois redéfinir certaines valeurs dans un ou plusieurs fichiers de mappage. J'ai lu plusieurs articles sur le Web à propos de ce problème et j'ai eu du mal à comprendre pourquoi cela se produit dans mon cas.

L'objet que je sauve 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". UPDATES fonctionne correctement sur les objets Personne existants déjà dans la base de données.

Suggestions?

Merci -wg

27
wgpubs

L'erreur signifie que l'instruction SQL INSERT est en cours d'exécution mais que le serveur ROWCOUNT renvoyé par SQL Server après son exécution est égal à 0 et non à 1 comme prévu.

Il existe plusieurs causes, allant de mappages incorrects à des déclencheurs UPDATE/INSERT pour lesquels rowcount est désactivé.

Votre meilleur temps 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 code SQL, vous pouvez en connaître la cause. Si ce n’est pas le cas, exécutez-le manuellement et voyez ce qui se passe. 

Aussi, je vous suggère d’afficher votre cartographie, car elle aidera les gens à déceler tout problème.

27
Iain

Cela peut arriver lorsque le ou les déclencheurs exécutent des requêtes DML (modification de données) supplémentaires affectant le nombre de lignes. Ma solution a été d'ajouter ce qui suit au sommet de ma gâchette:

SET NOCOUNT ON;
11
Mr. TA

Cela peut être dû à l'incrémentation automatique de la clé primaire. Pour résoudre ce problème, n’insérez pas de valeur dans l’incrémentation automatique. Insérer des données sans la clé primaire.

1
MacDaddy

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 fouillé un peu dans la source, j'ai découvert que vous pouvez créer un persister personnalisé qui ferait que NHibernate ignore les vérifications de 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
Robin Palm