Aiuto, credo di essere nella stessa situazione, ma ne la soluzione proposta da te, ne quella ribattuta dall'altro utente sembra avere effetto! Continuo a ricevere l'errore per cui esiste già nel contesto una entity con la stessa chiave! L'operazione è un'aggiornamento di una entity con all'interno una navigation property ad un'altra entity che, per prova, è stata manualmente modifica nel db tra una richiesta e l'altra. Il codice:
Protected Sub SalvaSchedaContatto()
Dim script As String = ""
If Page.IsValid Then
Dim cM As ContattoManager
Dim pM As New PersonaManager
Dim result As Boolean
Dim saveChanges As Integer = 0
Try
Using New UnitOfWorkScope(True)
cM = New ContattoManager
If Not Session("ResolveUpdateException_" & _c.Id) Is Nothing Then
result = cM.Update(_c)
TrasferisciRecapiti()
Dim oContext As System.Data.Objects.ObjectContext = DirectCast(UnitOfWorkScope.CurrentObjectContext, IObjectContextAdapter).ObjectContext
Dim refreshMode As Objects.RefreshMode = CType(Session("RefreshMode_" & _c.Id), System.Data.Objects.RefreshMode)
Try
oContext.SaveChanges()
Catch ex1 As UpdateException
For Each entry In ex1.StateEntries
Select Case entry.State
Case EntityState.Added
entry.ChangeState(EntityState.Modified)
oContext.Refresh(refreshMode, entry.Entity)
Case EntityState.Modified
oContext.Refresh(refreshMode, entry.Entity)
End Select
Next
Session("ExceptionResolved_" & _c.Id) = True
Session("ResolveUpdateException_" & _c.Id) = Nothing
Catch ex As Exception
If ex.GetType IsNot GetType(NotSupportedException) Then
Throw ex
End If
End Try
Else
result = cM.Update(_c)
TrasferisciRecapiti()
End If
End Using
ClearSession()
If Session("ResolveUpdateException_" & _c.Id) Is Nothing Then
If Not result Then
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-alert' style='display: inline-block'></span> Spiacenti: non hai l\'autorizzazione per apportare modifiche a questa scheda contatto." & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: 3000, modal: true, layout: " & ControlChars.Quote & "center" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "warning" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-salvataggio", script, True)
Else
If Not Session("Recapiti_" & _c.Id) Is Nothing Then
For Each r As Recapito In CType(Session("Recapiti_" & _c.Id), ICollection(Of Recapito))
r.IsInSession = False
Next
End If
If Not Session("Indirizzi_" & _c.Id) Is Nothing Then
For Each i As Indirizzo In CType(Session("Indirizzi_" & _c.Id), ICollection(Of Indirizzo))
i.IsInSession = False
Next
End If
Dim script1 As String = "$('.ui-state-highlight').removeClass('ui-state-highlight'); $('.ui-state-error').css({ display : 'none'});"
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-check' style='display: inline-block'></span> Salvataggio informazioni aggiornate avvenuto con successo!" & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: 3000, modal: false, layout: " & ControlChars.Quote & "bottomLeft" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "success" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "conferma-salvataggio", script, True)
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "rimuovi-stile", script1, True)
End If
Else
Session("ExceptionResolved_" & _c.Id) = Nothing
Session("ResolveUpdateException_" & _c.Id) = Nothing
If DirectCast(Session("RefreshMode_" & _c.Id), Objects.RefreshMode) = Objects.RefreshMode.ClientWins Then
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-notice' style='display: inline-block'></span>Salvataggio scheda avvenuto.<br /><strong>La scheda è stata aggiornata coi valori da te attualmente introdotti.</strong>" & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: false, modal: true, layout: " & ControlChars.Quote & "center" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "success" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "conferma-overwrite", script, True)
Else
script = "javascript:ConfermaDiscardUpdtes();"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-discard", script, True)
End If
Session("ResolveUpdateException_" & _c.Id) = Nothing
Session("RefreshMode_" & _c.Id) = Nothing
End If
Catch ex As DbEntityValidationException
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-alert' style='display: inline-block'></span> Si sono verificati dei problemi durante il salvataggio. <br >Di seguito " & _
"è riportata la descrizione dell'errore: " & DirectCast(ex, DbEntityValidationException).EntityValidationErrors.First.ValidationErrors.FirstOrDefault.ErrorMessage.ToString & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: false, modal: true, layout: " & ControlChars.Quote & "center" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "error" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-salvataggio", script, True)
Catch ex As DbUpdateConcurrencyException
If Session("ExceptionResolved_" & _c.Id) Is Nothing Then
Session("Entries_" & _c.Id) = ex
script = "javascript:RichiestaConfermaConcorrenzaViolata();"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-concorrenza", script, True)
End If
Catch ex As Exception
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-alert' style='display: inline-block'></span> Si sono verificati dei problemi durante il salvataggio. <br >Di seguito " & _
"è riportata la descrizione dell'errore: " & ex.Message.ToString & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: false, modal: true, layout: " & ControlChars.Quote & "center" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "error" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-salvataggio", script, True)
Finally
cM = Nothing
End Try
Else
script = "var conferma = noty({text:" & ControlChars.Quote & "<span class='ui-icon ui-icon-alert' style='display: inline-block'></span>Sembrano esserci degli errori di validazione nei campi del modulo." & ControlChars.Quote & _
", dismissQueue: true, force: true, timeout: 3000, modal: true, layout: " & ControlChars.Quote & "center" & ControlChars.Quote & ", theme: 'defaultTheme', type:" & ControlChars.Quote & "warning" & _
ControlChars.Quote & "});"
ScriptManager.RegisterStartupScript(Me.clientScriptContainer, Me.GetType(), "errore-salvataggio", script, True)
End If
End Sub
L'idea è quella di notificare all'utente il problema di concorrenza mediante uno strumento jquery e una volta impostata la scelta del refresh mode chiamarlo sul pezzo di routine che gestisce il salvataggio per chiamare il refresh del context...
Aiutooo.....