it-swarm.com.de

Linq-Zeile nicht gefunden oder geändert

Error Message: Row not found or changed.
Stack Trace:
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 

Dies geschieht scheinbar zufällig. Ich bekomme diese Fehler per E-Mail erhalten, und die angegebene URL scheint immer für mich zu funktionieren und sollte auch für alle anderen funktionieren.

Ich kann diesen Fehler beheben durch:

  • Gehe zu meinem dbml Layout
  • Alle Felder in der Tabelle auswählen, die Konflikte verursachen
  • Klicken Sie mit der rechten Maustaste und setzen Sie die Eigenschaft Update Check auf Never.

Dies scheint zu verhindern, dass diese Arten von Fehlern ausgelöst werden.

Es ist jedoch mühsam, daran zu denken, es immer wieder zu tun, wenn ich die dmbl-Möglichkeit wahrnehme, neue Tabellen hinzufüge usw. Gibt es eine bessere Möglichkeit, dieses Problem zu lösen? Ich bekomme vielleicht 50-100 davon pro Tag, was für meine Besucher schlecht ist.

17
Tom Gullen

Jedes Mal, wenn ich diesen Fehler sehe, bedeutet dies, dass sich etwas in der Datenbank zwischen dem Zeitpunkt, zu dem ich den Datensatz/Objekt/was auch immer geladen habe, geändert hat und wann ich versuchte, es zu speichern. Es war auf jeden Fall so, weil meine Arbeitseinheit zu groß war.

Ich kenne die genaue Natur Ihrer Anwendung nicht, aber ich gehe davon aus, dass Sie einen Datenkontext erstellen, einen Datensatz oder eine Liste von Datensätzen laden, einige Vorgänge daran ausführen, einige Zeit und Prozessorzyklen aufbrauchen und dann die versuchen, die geänderten Daten wieder in der Datenbank zu speichern. Vielleicht sogar eine Instanz eines Datensatzes/Objekts laden und für eine Weile in einer Klassenvariablen speichern und dann am Ende einer Seite laden oder einen Thread oder was auch immer versuchen, etwas zu speichern, das sich geändert hat. Das Problem ist, dass LINQ eine Kopie davon gespeichert hat, dh die Kopie, die aktualisiert werden soll. Wenn sich die zugrunde liegenden Daten in der Zwischenzeit ändern, werden sie verrückt.

Fragen Sie sich, was passiert, wenn Sie Ihre Daten während der gesamten Lebensdauer Ihrer Objekte sperren möchten. Sagen Sie, dass Sie irgendetwas, das Sie geladen haben, ändern können. Niemand darf es während dieser Zeit berühren. Grundsätzlich ist das hier die Annahme. Zugegeben, LINQ ist etwas optimistischer. Es hat keinen Sinn, die Zeile oder Tabelle zu sperren, wenn Sie die Daten niemals aktualisieren, aber Sie denken über diese Probleme nach. Fragen Sie sich, was bei einer strengen Transaktionssperre für Ihre Objekte zu einer erheblichen Beeinträchtigung oder zu einer Verlangsamung führen würde, und dies führt wahrscheinlich zu einem fehlerhaften Code.

Meine Lösung dafür ist, meine Arbeitseinheit so klein wie möglich zu halten. Laden Sie das Objekt nicht, verwenden Sie es nicht als Arbeitskopie und speichern Sie es in einem einzigen Kontext in der Datenbank. Laden Sie stattdessen das Objekt, ziehen Sie die benötigten Informationen in einem Schritt heraus, ermitteln Sie die Änderungen, die Sie anwenden müssen, und laden/aktualisieren/speichern Sie das Objekt. Sicher, es führt zu mehr Roundtrips zur Datenbank, gibt Ihnen jedoch eine bessere Sicherheit, dass Sie mit der neuesten Datenkopie arbeiten. Es bleibt "last in, wins", was bedeutet, dass wenn jemand ein Update vorgenommen hat, während Sie mit den Daten gearbeitet haben, diese verloren gehen. Dies ist jedoch immer ein Risiko, wenn Sie den Datensatz nicht mit einer Transaktion sperren. Es bietet Ihnen jedoch die Flexibilität, dass, wenn ein anderer Benutzer nicht zusammenhängende Felder in derselben Zeile ändert, Sie beide diese Daten gemeinsam bearbeiten können.

28
Mike Mooney

Ich hatte das gleiche Problem und löste es, indem ich dbml mit der db-Struktur verglich. Eine Eigenschaft wurde nicht auf null gesetzt, was zu dem Problem führte.

Überprüfen Sie also Ihre Datenbank und ihre Eigenschaften.

50
Tomasz Maj

GetTable (). Attach (newEntity, originalEntity);

Wenn Sie kein Versionsfeld zum Aktualisieren verwenden. Die obige Methode parametrisiert neue Details und alte Detailentitäten. Wenn die ursprüngliche Entität zu diesem Zeitpunkt geändert wird, wird immer noch derselbe Fehler angezeigt. Dies liegt an Ihnen. Das funktioniert wie ein Zauber, ich habe es ausprobiert. 

2
Serame

Dies kann auch passieren, wenn ein Datenbank-Trigger eine Spalte in einer Zeile ändert, die Sie aktualisieren - selbst wenn Sie diese bestimmte Spalte nicht aktualisieren. 

Sie müssen überprüfen, ob die betroffenen Tabellen in Ihrer Arbeitseinheit keine Auslöser haben. Wenn Sie Update-Auslöser verwenden, möchten Sie wahrscheinlich sicherstellen, dass die aktualisierten Spalten NeverCheck sind.

2
Jacob

Manchmal ist es ganz einfach ... Stellen Sie sicher, dass der Tisch nicht gesperrt ist. In meinem Fall enthielt die Benutzeroberfläche von SQL Server Management Studio Sperren, über die ich während des Debugging nichts wusste (ich erinnerte mich nicht). Beim Entladen wurden die Sperren aufgehoben und die Dinge funktionierten wieder.

1
jco

Mit SQL Profiler habe ich die SQL-Transaktionen zu meinem Server verfolgt und festgestellt, dass die übermittelte UPDATE-Anweisung auf SubmitChanges() einen falschen Wert in der WHERE-Klausel enthält. Dies liegt daran, dass ich eine Eigenschaft habe, die folgendermaßen aussieht:

class Position{
...
    [Column]
    public int Pieces{
        get{
            this.pieces = this.Transformers.Count;

            return this.pieces;
        }
        set{ this.pieces = value; }
    }
...
}

Da Transformers ein List<Transformers>-Element ist, das eine Liste von One-To-Many-Beziehungen zu einer anderen Transformers-Tabelle darstellt, muss ich die Liste manuell mit jedem Transformer füllen, der einen Fremdschlüssel für mein Position-Objekt enthält. Wenn ich das aus irgendeinem Grund nicht mache, erhalte ich den erwähnten Fehler, da die Pieces-Eigenschaft vom ursprünglichen Wert abweicht. 

Daher sucht die SQL-Anweisung für SubmitChanges() nach einem Eintrag WHERE Pieces = somevalue, aber der tatsächliche Wert von Pieces im Eintrag lautet anothervalue. Im Grunde wird LINQ denken, dass Sie inzwischen etwas in der Datenbank geändert haben, da die Datenbank für diese Anfrage keinen Wert zurückgibt.

Wie gesagt, eine Lösung ist:

    [Column(UpdateCheck=UpdateCheck.Never)]
    public int Pieces
    {
        get {
            this.pieces= this.Transformers.Count;

            return this.pieces; 
        }
        set { this.pieces= value; }
    }

Natürlich lässt sich dies auch leicht durch Einrichten einer einfachen Getter-Funktion lösen 

getPieces(){
    return this.Transformers.Count();
}

und eine "unvoreingenommene" Eigenschaft

class Position{
...
    [Column]
    public int Pieces{
        get{ return this.pieces; }
        set{ this.pieces = value; }
    }
...
}

Ich hoffe, das kann jemandem helfen. Ich poste dies auch, weil es mir Stunden meines Lebens erspart hätte, wenn es vorher jemand anderes gegeben hätte.

1
Flaudre

Ich habe das gleiche Problem konfrontiert. Das Problem tritt auf, wenn Sie eine Zeile aktualisieren.

Zum Beispiel habe ich eine Tabelle mit Spalten:

id,firstname,lastname,age

und ich möchte das alter mit der dbml aktualisieren. Im Profiler sehe ich Update [email protected] Wo [email protected] Und [email protected] Und [email protected].

Aber zwischen dem Lesen der Zeile und dem Aktualisieren hat ein anderer Prozess den Vor- oder Nachnamenwert geändert. Das UPDATE schlägt fehl, weil die WHERE -Klausel für eine der Spalten einen anderen Wert hat und das Update @@rowcount==0 An die Datenbank zurückgibt, wodurch der Fehler behoben wird, den Sie erhalten.

0

aktualisieren von Linq zu SQL-Schema in Designer beheben Problem in meinem Fall

0
Ivan Ivanov

Ich habe diese Fehlermeldung unter Windows Phone 8 erhalten. Es dauerte eine Weile, bis ich herausfand, was das Problem war. Im Grunde war es so:

Ich hatte eine Klasse namens TrackingInformation. 1. Von einem Server habe ich eine aktualisierte Version davon abgerufen. 2. Mein TileService hat die sekundäre Kachel mit ihren Informationen und (!!) 1 Eigenschaft aktualisiert und in der lokalen Datenbank des Telefons gespeichert. 3. Ich habe versucht, die erste Instanz des Objekts erneut zu speichern, und hier wurde der Fehler "Zeile nicht gefunden oder geändert" angezeigt.

Für mich musste ich nur den 3. Teil entfernen und es hat gut funktioniert (ich wurde bereits mit der aktualisierten Version gespeichert). Aber da sich eine Eigenschaft geändert hatte, war es eine Ausnahme ... 

Ich kann es kaum erwarten, bis EF7 zu Windows Phone kommt, so viel Kopfschmerzen mit der aktuellen EF auf WP8.

0
robertk