Domanda

Prima di tutto, non v'è alcuna possibilità che questo è un problema multi-utente, come sto lavorando a livello locale su una versione dev del database.

sto ottenendo l'errore Row not found or changed non molto esplicativo viene generata quando mi esibisco db.SubmitChanges (). Se rompo l'esecuzione poco prima delle SubmitChanges () si verifica, posso controllare in SQL Server Management Studio e la riga fa esiste!

Ecco il codice per l'intera funzione, solo per metterlo in contesto per chi vuole aiuto, ma la linea problema è proprio alla fine (linea 48).

Aggiorna Questo è un davvero strano: l'errore è causato aggiornando matchingTrans.Url (vedi penultima riga del codice). Commentando questa riga non genera l'errore -. Anche se il matchingTrans.Title ancora viene aggiornato

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.
        }
    }
}
È stato utile?

Soluzione

Guardando l'uscita di SQL Profiler, mi ha aiutato a capire la risposta a questo. C'era un cattivo pezzo di SQL viene generato che si è conclusa con WHERE 0 = 1 ... un evidente errore.

Si scopre che il campo aveva semplicemente stato modificato per consentire i null da un altro sviluppatore, e il file di LINQ to SQL non era stato aggiornato di conseguenza.

In breve, se sembra essere generato per nessun motivo il messaggio di errore Row not found or changed, assicurarsi che lo schema del database corrisponde esattamente alla lima .dbml altro si otterrà questo messaggio di errore su tutti i campi che hanno leggermente diverse schemi.

Altri suggerimenti

Date un'occhiata alla proprietà di connessione "No Count" a livello del server sql server
1. Fare clic destro sulla connessione di SQL Server in Esplora oggetti -> Proprietà Pagina 2. Vai a collegamento Tab / Pagina Pagina 3. Cercare l'opzione di connessione di default "no count" Pagina 4. Assicurarsi che questa opzione non è selezionata.

Un'altra possibilità che ho trovato da aggiungere alla lista eccellente di risposte qui:

Quando si utilizza una colonna non annullabile in una banca dati - allora mappatura che a un tipo di dati che è intrinsecamente nullable (in questo esempio tipo DB è lungo BLOB NOT NULL mappata a un array di byte in C #) si può finire in una situazione dove l'aggiornamento del database con la stessa matrice di byte provoca questo errore per essere gettato.

Esempio: avete un sito web che permette all'utente di caricare un'immagine al database. Il vostro tavolo ha un blob (immagine in SQL Server, a prescindere) che non è annullabile. I sceglie all'utente di aggiornare il record con la stessa immagine che è già presente. Il controllo degli aggiornamenti fallirà. Ho fissato questo dapprima facendo un controllo .SequenceEqual () e poi solo chiamando .SubmitChanges () sull'oggetto contesto se l'array di byte in ingresso non era uguale a quella esistente.

Ho avuto questo problema anche quando lo schema del database e dbml abbinati esattamente. Il problema era che stavo cercando di cambiare un'entità e le entità di inserimento in una singola istruzione SubmitChanges. Ho riparato facendo SubmitChanges su ciascuna operazione, invece di tutti in una volta.

Questo era tutto in un ambito di transazione in modo che possa avere qualcosa a che fare con esso, ma non sono sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top