Domanda

Questa deve essere una domanda frequente, ma non ancora su SO, quindi sembra. Sto usando Linq to SQL per un'applicazione che consente una varietà di modifiche ai dati nel mio modello in memoria e le modifiche verranno quindi inserite in una coda per l'elaborazione asincrona. Quindi, non sono preoccupato per gli aggiornamenti (ancora). È possibile apportare modifiche a varie parti dei dati tramite popup modali nella pagina Web. Alcuni sono basati su griglia, altri sono solo attributi. Sto riscontrando un problema con le modifiche che non sopravvivono ai cicli di postback. Ovviamente, non voglio persistere nel database fino a quando non vengono apportate tutte le modifiche e l'utente non invia la pagina.

Il percorso che ho scelto finora è:

  • Ho disabilitato il caricamento posticipato
  • Creo una classe parziale [serializzabile] per il mio oggetto root
  • Ho inserito l'oggetto nella sessione e l'ho recuperato nell'evento onload

Questo sembra funzionare in linea di principio. Tuttavia, quando provo ad aggiornare alcune proprietà dei bambini dopo aver recuperato l'oggetto dalla sessione

p.PhysicianSpecialties[0].physician_specialty_code = 
    ddlSpecialty.SelectedItem.Value;

Ottengo questo errore:

Operation is not valid due to the current state of the object.

L'errore è causato da questa chiamata del metodo nel metodo setter Linq generato:

this.SendPropertyChanging();

Altre proprietà vengono aggiornate correttamente:

p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();

Ciò non causa un errore.

Le mie domande: sono fondamentalmente sulla strada sbagliata? C'è un modo migliore per farlo? Cosa causa l'errore?

Aggiornamento: L'eccezione è "System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException". Penso che qualcosa , ma non conosco ancora la soluzione.

È stato utile?

Soluzione

Ho ottenuto la soluzione da MSDN. Il problema è, ed è spiegato meglio in questo thread di quanto io possa fare, che non si può cambiare unilateralmente un'associazione, ma bisogna farlo ad entrambe le estremità, assegnando un nuovo oggetto figlio, non solo cambiando l'id:

p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup =     db.PhysicianSpecialtyLookups.Single (c = >     (c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));

Altri suggerimenti

E come si fa se si utilizza l'associazione dati? Ho un elenco a discesa in una vista della griglia di dati che ha iniziato a generare questo errore quando cambio il valore a discesa. Questo mi fa pensare che devo eliminare l'associazione o non utilizzare l'associazione dei dati.

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