2010-11-03 9 views
24

Ogni volta che cerco di creare una particolare entità ... voglio solo sapere come dovrei andare a capire la causa.Come risolvere "L'aggiornamento batch ha restituito il conteggio delle righe inatteso dall'aggiornamento, il conteggio delle righe effettivo: 0, previsto: 1" problema?

Utilizzo la procedura di automapping di Fluent NHibernate, quindi forse non ho impostato una convenzione in modo appropriato e/o ho bisogno di sovrascrivere qualcosa in uno o più file di mapping. Sono andato attraverso una serie di post sul web per quanto riguarda questo problema e avendo difficoltà a capire esattamente perché sta accadendo nel mio caso.

L'oggetto che sto salvando è piuttosto semplice. È un oggetto "Persona" che fa riferimento a un'entità "Società" e ha una raccolta di entità "Indirizzo". AGGIORNAMENTI funzionano bene su oggetti Person esistenti già presenti nel database.

Suggerimenti?

Grazie -WG

risposta

25

L'errore significa che l'istruzione SQL INSERT è in esecuzione, ma il ROWCOUNT viene restituito da SQL Server dopo si corre è 0, non 1 come previsto.

Esistono diverse cause, dai mapping non corretti, ai trigger UPDATE/INSERT che hanno il conteggio delle righe disattivato.

Il tuo miglior beat è quello di profilare le istruzioni SQL e vedere cosa succede. Per farlo, attiva nHibernate sql logging o usa il profiler sql. Una volta che hai l'SQL potresti conoscere la causa, altrimenti prova a eseguire manualmente l'SQL e vedi cosa succede.

Inoltre, ti suggerisco di postare la tua mappatura, in quanto aiuterà le persone a individuare eventuali problemi.

+1

Sì. Nel mio caso sto usando il framework SharpArchitecture che imposta automaticamente i valori non salvati per il campo "Id" a zero ... invece di -1 come sono stato abituato a usare per anni. Ho provato a sovrascrivere questo nella mia configurazione di automapping e anche in una classe di mappatura personalizzata ... ma lo imposta su 0. – wgpubs

+1

Quindi hai provato questo: Id (a => a.Id) .UnsavedValue (0); Se hai ancora problemi e vuoi che ti dia un'occhiata, aggiungi l'SQL risultante e il tuo mapping nella tua domanda. – Iain

+1

ho avuto questo problema perché un oggetto nullo è stato aggiunto a una raccolta, quindi è stato fatto un salvataggio. – m4tt1mus

9

Ciò può accadere quando i trigger eseguono ulteriori query DML (modifica dei dati) che influiscono sui conteggi delle righe. La mia soluzione era quella di aggiungere quanto segue all'inizio del mio trigger:

SET NOCOUNT ON; 
0

Ciò può verificarsi a causa della chiave primaria di incremento automatico. Per risolvere questo problema non inserire il valore di incremento automatico con il set di dati. Inserisci i dati senza la chiave primaria.

0

Quando si targetizza una vista con un trigger INSTEAD OF, può essere quasi impossibile ottenere il numero di righe corretto. Dopo aver approfondito un po 'la fonte, ho scoperto che è possibile creare un persister personalizzato che faccia ignorare gli assegni di conteggio di NHibernate.

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

Ciao, potresti dirmi come usi questo persister? –