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

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.

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