2010-01-18 8 views
6

Recentemente ho ricevuto un messaggio di errore da un cliente e non ho avuto la possibilità di risolverlo. Spero che qualcuno possa darmi qualche idea su cosa possa essere sbagliato.Errore durante l'eliminazione di un record tramite Linq2SQL

L'errore sembra abbastanza semplice:

Csla.DataPortalException: DataPortal.Delete riuscita (System.InvalidOperationException: Sequence contiene più di un elemento alla System.Linq.Enumerable.SingleOrDefault [TSource] (fonte IEnumerable`1)

Ecco il mio metodo DataPortal_Delete, che prende il FileId (PK) come parametro.

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

la prima cosa che ho check è stato quello di vedere se c'era un altro record con lo stesso FileId (pur essendo la prima ry key, questo dovrebbe essere impossibile). Tutti i file ID erano in effetti unici. Ho lanciato l'applicazione connettendomi al database del cliente e ho provato a cancellare il record e ha funzionato senza problemi. Il responsabile IT del sito del cliente ha utilizzato il "Problem Step Recorder" per inviarmi screenshot passo passo delle azioni intraprese dall'utente. Niente di straordinario, e quando ha usato una macchina diversa, è stato in grado di cancellare il record senza errori. Apparentemente ciò accade solo quando l'applicazione viene eseguita in Windows 7.

Detto questo, qualche idea su cosa potrebbe causare questo?

+0

Files.FileId è la chiave primaria su quel tavolo? –

+0

Sei sicuro che l'errore sia generato da questo snippet di codice? L'errore fa riferimento a SingleOrDefault, ma la funzione utilizza Single. – gfrizzle

+0

Le file sorgenti sono nulle? se questi sono oggetti diversi non devi usare un include per averli prima di poterli eliminare? – awright18

risposta

1

Supponendo che la chiamata al singolo è l'origine del problema, invece di:

ctx.DataContext.Files.Single(...) 

modifica il codice per permettere il ritorno di più righe da quella query e quindi accedere come si tornare quando si restituisce più di una riga. Questo dovrebbe indirizzarti verso il tuo problema di dati "duplicati".

Un'altra cosa da guardare è l'SQL che viene generato dietro le quinte. Non sono sicuro che ti aiuterà, ma non può far male. Non conosco il tuo modello di dati, quindi non riesco a capire il tuo codice come vorrei.

+0

Il messaggio di eccezione è abbastanza chiaro; Single impone il fatto che verrà restituita solo una riga. Due o più porteranno all'eccezione. Non cambierei il codice però; una semplice istruzione sql troverà il dupe: 'select fileid, count (*) dal gruppo Files da fileid che ha count (*)> 1' – Andy

0

Se si verifica solo in Windows 7, questo potrebbe essere causato dal sistema operativo. Hai provato su Vista? L'ambiente di Vista è simile a Windows 7. È inoltre possibile utilizzare la modalità Windows Virtual PC + XP. Questa è un'applicazione di virtualizzazione progettata appositamente per Windows 7 per consentire agli utenti di eseguire applicazioni come in Windows XP. Nota: la modalità XP richiede un processore con capacità di virtualizzazione.

0

Ho avuto la stessa eccezione durante l'eliminazione di un'entità. Il problema si è rivelato essere una relazione di chiave esterna definita nel file dbml. Quindi questo è stato il motivo dell'eccezione nel mio caso. Dopo aver rimosso che ha funzionato per eliminare il record (e non volevo eliminare a cascata i record dall'altra tabella, ho solo bisogno di scoprire come configurare linq-to-sql per impostare semplicemente la colonna chiave esterna su null)

Problemi correlati