2010-11-03 7 views
24

Immer wenn ich dies versuche, versuche ich, eine bestimmte Entität zu ERSTELLEN ... will nur wissen, wie ich die Ursache herausfinden soll.Wie zu lösen "Batch-Update zurückgegeben unerwartete Zeilenanzahl von Update; tatsächliche Anzahl der Zeilen: 0; erwartet: 1" Problem?

Ich verwende Fluent NHibernate automapping, also vielleicht habe ich keine Konvention entsprechend festgelegt und/oder muss etwas in einer oder mehreren Mapping-Dateien überschreiben. Ich habe eine Reihe von Posts im Web über dieses Problem durchgelesen und habe es schwer gefunden, genau herauszufinden, warum es in meinem Fall passiert.

Das Objekt, das ich spare, ist ziemlich einfach. Es ist ein Objekt "Person", das auf eine Entität "Firma" verweist und eine Sammlung von Entitäten "Adresse" aufweist. UPDATES funktionieren gut mit vorhandenen Person-Objekten, die sich bereits in der Datenbank befinden.

Vorschläge?

Dank -wg

Antwort

25

Der Fehler bedeutet, dass die SQL-Anweisung INSERT ausgeführt wird, aber die ROWCOUNT von SQL Server zurückgegeben wird, nachdem er 0 ausgeführt wird, nicht 1 wie erwartet.

Es gibt mehrere Ursachen, von falschen Zuordnungen, bis zu UPDATE/INSERT-Triggern, bei denen der Zeilenzähler deaktiviert ist.

Ihr bester Beat ist, die SQL-Anweisungen zu profilieren und zu sehen, was passiert. Aktivieren Sie dazu entweder nHibernate sql logging, oder verwenden Sie den SQL Profiler. Sobald Sie das SQL haben, können Sie die Ursache kennen, wenn nicht, versuchen Sie, das SQL manuell auszuführen und zu sehen, was passiert.

Auch ich empfehle Ihnen, Ihr Mapping zu veröffentlichen, da es Leuten helfen wird, irgendwelche Probleme zu entdecken.

+1

Yup. In meinem Fall verwende ich das SharpArchitecture-Framework, das ungespeicherte Werte für das "Id" -Feld auf null setzt ... statt -1, wie ich es seit Jahren gewohnt bin. Ich habe versucht, dies in meiner automapping-Konfiguration und sogar in einer benutzerdefinierten Mapping-Klasse zu überschreiben ... aber setzt es immer noch auf 0. – wgpubs

+1

Also hast du es versucht: Id (a => a.Id) .UnsavedValue (0); Wenn Sie immer noch Probleme haben und wollen, dass ich es mir anschaue, fügen Sie das resultierende SQL und Ihr Mapping in Ihre Frage ein. – Iain

+1

Ich hatte dieses Problem, weil ein Null-Objekt zu einer Sammlung hinzugefügt wurde und dann ein Speichervorgang ausgeführt wurde. – m4tt1mus

9

Dies kann passieren, wenn Trigger zusätzliche DML-Abfragen (Datenmodifikation) ausführen, die sich auf die Zeilenanzahl auswirken. Meine Lösung bestand darin, am oberen Rand meines Triggers Folgendes hinzuzufügen:

SET NOCOUNT ON; 
0

Dies kann wegen Auto-Inkrement-Primärschlüssel auftreten. Um dieses Problem zu lösen, setzen Sie den Wert für die automatische Inkrementierung nicht mit dem Datensatz ein. Fügen Sie Daten ohne den Primärschlüssel ein.

0

Beim Targeting einer Ansicht mit einem INSTEAD OF-Trigger kann es nahezu unmöglich sein, die richtige Zeilenanzahl zu erhalten. Nachdem ich ein wenig in die Quelle eingedrungen bin, habe ich herausgefunden, dass Sie ein benutzerdefiniertes Persister machen können, was NHibernate dazu veranlasst, die Anzahl der Checks zu ignorieren.

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

Hallo, kannst du mir bitte sagen, wie du diesen Persister benutzt? –