Domanda

ho un semplice LINQ to SQL oggetto. Afferro dal database e cambiare un campo quindi salvare.

Nessuna riga sono stati aggiornati. : (

Quando controllo il codice SQL completo che viene inviato sul filo, noto che fa un aggiornamento alla riga, non tramite la chiave primaria ma tutti i campi tramite la clausola dove. È normale? Avrei pensato che sarebbe stato facile per aggiornare il campo (s) con la clausola WHERE di collegamento sulla chiave primaria, invece di where'ing (che è una parola: P). Su ogni campo

Ecco il codice ...

using (MyDatabase db = new MyDatabase())
{
    var boardPost = (from bp in db.BoardPosts
        where bp.BoardPostId == boardPostId
        select bp).SingleOrDefault();

    if (boardPost != null &&
        boardPost.BoardPostId > 0)
    {
        boardPost.ListId = listId; // This changes the value from 0 to 'x'
        db.SubmitChanges();
    }
}

ed ecco qualche esempio SQL ..

exec sp_executesql N'UPDATE [dbo].[BoardPost]
SET [ListId] = @p6
WHERE ([BoardPostId] = @p0) AND .... <snip the other fields>',N'@p0 int,@p1 int,@p2 nvarchar(9),@p3 nvarchar(10),@p4 int,@p5 datetime,@p6 int',@p0=1276,@p1=212787,@p2=N'ttreterte',@p3=N'ttreterte3',@p4=1,@p5='2009-09-25 12:32:12.7200000',@p6=72

Ora, so che c'è un campo datetime in questo aggiornamento .. e quando ho controllato il DB il suo valore era / è '2009-09-25 12: 32: 12,720' (meno zeri, dalle precedenti) .. così ho non sono sicuro se questo è rovinare la cui condizione di clausola di ...

ma ancora! dovrebbe fare una clausola in cui il PK .. se nulla .. per la velocità!

Sì / no?


UPDATE

Dopo aver letto la risposta di nitzmahone, Allora ho provato a giocare con la concorrenza ottimistica su alcuni valori, e ancora non ha funzionato: (

Allora ho iniziato qualcosa di nuovo ... con la concorrenza ottimistica accadendo, include una clausola WHERE sul campo si sta cercando di aggiornare. Quando ciò accade, non funziona.

così .. in SQL sopra, la clausola in cui si presenta così ...

WHERE ([BoardPostId] = @p0) AND ([ListId] IS NULL) AND ... <rest snipped>)

Questo non suona bene! il valore nel DB è nullo, prima di fare l'aggiornamento. ma quando aggiungo il valore ListId alla clausola in cui (o più precisamente, quando L2S aggiungere di essa a causa della concurrecy optomistic), non riesce a trovare / match con la riga.

WTF?

È stato utile?

Soluzione

La roba dove clausola è Normale-Patologico Google "concorrenza ottimistica", se non si conosce il motivo. Si può scegliere di comportamento impostando tutti i campi a "UpdateCheck: Mai" nella finestra di progettazione dbml (ma capire che si sta dando a un importante controllo di sicurezza in questo modo).

Il fatto che l'aggiornamento non riesce è probabilmente dovuto a un valore tipo di dati o una fonte non corrispondenti tra il DBML e DB (è facile per loro di uscire di Sync-ci sono 3rd strumenti di terze parti per confrontare DBML a DB per questo tipo di cosa). Per provare, provare a eseguire l'istruzione di aggiornamento acquisita in SSMS, ma rimuovere i valori dalla clausola in cui fino ad ottenere "1 riga interessata". Una volta funziona, avete trovato la vostra colonna problema.

Altri suggerimenti

Il comportamento si sta descrivendo suggerisce che il database e il vostro LINQ to SQL oggetto ha ottenuto fuori sincrono. Si dovrebbe cercare di eliminare la classe dalla LINQ to SQL Progettazione classi, salvare, trascinare la tabella di nuovo nel designer Database Explorer, e salvare di nuovo. Questo dovrebbe chiarire il problema di aggiornamento.

provare a mettere questo prima submitchanges()

_tdIssuesLog.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, issueslog);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top