Come posso aggiornare in Linq un'entità disconnessa dal database?
Domanda
Il codice seguente non viene eseguito correttamente e genera un errore InvalidOperationExcepiton
.
public void Foo()
{
DataContext context = new DataContext();
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
context.LinqEntities.Attach(item, true);
}
Soluzione
Per impostazione predefinita, le entità utilizzeranno tutti i campi per verificare la concorrenza quando apportano modifiche.Questo è ciò che genera InvalidOperationException.
Ciò può significare l'impostazione della proprietà Controllo aggiornamenti per tutti i campi su Mai.Questa operazione deve essere eseguita su tutti i campi per allegare l'entità modificata.In tal caso, un'ulteriore chiamata a context.SubmitChanges() salverà i dati.
In alternativa, se si conoscono i valori originali, è possibile allegarli e quindi apportare gli aggiornamenti, ma tutti i valori da controllare devono corrispondere ai valori originali.
LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"};
context.LinqEntities.Attach(item);
item.Name = "John";
item.Surname = "Doe";
context.SubmitChanges();
Altri suggerimenti
Non sono sicuro di cosa intendi per disconnesso dal database.
Sembra che tu stia tentando di inserire una nuova riga nella tabella LinqEntities: è corretto?
Se è così, ti consigliamo di farlo
context.LinqEntities.InsertOnSubmit(item);
context.Submit();
OK, se stai provando ad aggiornare una riga con ID = 1, lo farai in questo modo:
DataContext context = new DataContext();
LinqEntity item = (from le in context.LinqEntities
where le.ID == 1
select le).Single();
item.Name = "John";
item.Surname = "Doe";
context.Submit();
Potresti anche sostituire l'espressione Linq con una lambda più concisa:
LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);
La cosa più importante che DataContext fa è tenere traccia di tutte le modifiche apportate, in modo che quando chiami il metodo Submit generi automaticamente le istruzioni Insert per le cose che hai modificato.
Quando si utilizza un ORM in genere si seleziona un oggetto prima di aggiornarlo.
Puoi usare DataContext.ExecuteCommand(...)
per bypassare l'ORM se non si desidera effettuare una selezione.