Frage

Zunächst einmal gibt es keine Chance, dass dies ein Multi-User-Thema, da ich lokal auf einer Entwickler-Version der Datenbank arbeiten.

Ich erhalte die nicht sehr erklärend Row not found or changed Fehler ausgelöst wird, wenn ich db.SubmitChanges durchführen (). Wenn ich die Ausführung kurz vor dem SubmitChanges brechen () auf, die ich in SQL Server Management Studio überprüfen und die Zeile hat exist!

Hier ist der Code für die gesamte Funktion, nur um es für jedermann in Zusammenhang zu bringen, die helfen wollen, aber das Problem Linie ist direkt am Ende (Zeile 48).

Aktualisieren Dies ist eine wirklich ungerade: der Fehler verursacht wird, durch matchingTrans.Url Aktualisierung (vorletzte Zeile Code sehen). Kommentieren Sie diese Zeile die Fehler nicht werfen -. Auch wenn die matchingTrans.Title noch aktualisiert wird

private static void MenuItemUpdate(int languageId, NavigationItem item)
{
    using (var db = DataContextFactory.Create<MyDataContext>())
    {
        // Select existing menu item from database.
        var dbItem =
            (from i in db.MenuItems
             where i.Id == item.Id
             select i).Single();
        // Obtain ID of link type.
        dbItem.FkLinkTypeId = GetLinkTypeByName(
            Enum.GetName(typeof (NavigationItemLinkType), item.LinkType)).Id;
        // Update the Link field with what is given.
        dbItem.Link = item.Link;
        db.SubmitChanges();

        // Item already exists and needs editing.
        // Get associated translations.
        var trans =
            from t in db.MenuItemTranslations
            where t.FkMenuItemId == item.Id
            select t;

        // If translation exists for given language, edit it.
        var matchingTrans =
            (from t in trans
             where t.FkLanguageId == languageId
             select t).SingleOrDefault();

        if (matchingTrans == null)
        {
            // No matching translation - add one.
            var newDbTrans = new MenuItemTranslation
            {
                FkMenuItemId = item.Id,
                FkLanguageId = languageId,
                Title = item.Title,
                Url = item.FriendlyUrl
            };
            db.MenuItemTranslations.InsertOnSubmit(newDbTrans);
            db.SubmitChanges();
        }
        else
        {
            // Matching translation - edit it.
            matchingTrans.Title = item.Title;
            matchingTrans.Url = item.FriendlyUrl;
            db.SubmitChanges();
            // WTF ERROR: Row not found or changed.
        }
    }
}
War es hilfreich?

Lösung

Mit Blick auf die SQL Profiler-Ausgabe, es hat mir geholfen, diese aus der Antwort Figur. Es wurde ein schlechtes Stück SQL erzeugt, die mit WHERE 0 = 1 beendet ... einem offensichtlichen Fehler.

Es stellt sich heraus, dass das Feld war einfach geändert nulls von einem anderen Entwickler zu ermöglichen, und die Linq-to-SQL-Datei entsprechend aktualisiert worden war.

Kurz gesagt, wenn die Row not found or changed Fehlermeldung ohne Grund erzeugt zu sein scheint, stellen Sie sicher, Ihre Datenbank-Schema genau entspricht Ihrer .dbml Datei sonst werden Sie diese Fehlermeldung auf alle Felder erhalten, die haben leicht unterschiedliche Schemata.

Andere Tipps

Werfen Sie einen Blick auf die Verbindungseigenschaft „No Count“ auf SQL Server-Server-Ebene
1. Rechtsklick auf SQL Server-Verbindung im Objekt-Explorer -> Immobilien
2. Zum Anschluss Tab / Seite
3. Achten Sie auf die Standard-Verbindungsoption „no count“
4. Stellen Sie sicher, dass diese Option nicht aktiviert ist.

Eine weitere Möglichkeit, dass ich gefunden habe, hier die hervorragende Liste von Antworten hinzuzufügen:

Bei Verwendung einer nicht-Nullable-Spalte in einer Datenbank - dann zu einem Datentyp zuordnen, dass die intrinsisch nullable ist (in diesem Beispiel DB Typ LONG BLOB NOT NULL auf einen Byte-Array in c # abgebildet) Sie in einer Situation können am Ende wo die Datenbank mit dem exakt gleichen Byte-Array Aktualisierung verursacht diese Fehler ausgelöst werden.

Beispiel: Sie haben eine Website, die es dem Benutzer ermöglicht, ein Bild in die Datenbank zu laden. Ihre Tabelle hat einen Klecks (Bild in SQL Server, was auch immer), die keine Nullwerte enthalten ist. Der Benutzer wählt den Datensatz mit dem exakt gleichen Bild zu aktualisieren, die bereits vorhanden ist. Die Update-Prüfung fehl. Ich reparierte dies, indem zunächst eine .SequenceEqual () Prüfung tun und dann nur telefonieren .SubmitChanges () auf dem Kontextobjekt, wenn der ankommende Byte-Array nicht wurde auf den bestehenden gleich.

Ich hatte dieses Problem auch dann, wenn das Datenbankschema und dbml genau abgestimmt. Das Problem war, ich habe versucht, eine Einheit und Einsatzeinheiten in einer einzigen SubmitChanges Aussage zu ändern. Ich reparierte sie durch SubmitChanges auf jeder Operation statt alle auf einmal zu tun.

Das war alles in einem Transaktionsbereich so, dass etwas mit ihm zu tun hat, aber ich bin nicht sicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top