Quando si lavora con Entity “staccate” dal context attraverso il metodo Detach, e successivamente queste Entity vengono modificate, per aggiornare le modifiche ci sono due strade:
la prima è quella di fare l’attach dell’Entity originale e poi aggiornare le modifiche con
context.Attach(oldEntity);
context.ApplyPropertyChanges(“EntitySetName”, newEntity);
la seconda, se non si ha a disposizione l’entity originale è di “richiamarla” in qualche modo e poi applicare di nuovo le modifiche sempre con con
object oldEntity = context.GetObjectByKey(newEntity.EntityKey)
context.ApplyPropertyChanges(“EntitySetName”, newEntity);
Entrambe le strade però hanno due inconvenienti:
- il pimo, piuttosto veniale, è che eventuali campi “blob” vengono inclusi nella SQL di aggiornamento, con possibili problemi di performances
- il secondo è che le Entity referenziate, se modificate, non vengono aggiornate.
per ovviare a questo secondo inconveniente è necessario ri-agganciare le Entity referenziate a mano, nel modo che più ritenete opportuno.
Vi ricordo che di default Entity Framework non implementa la concorrenza ottimistica: aggiorna il record senza verificare la presenza sul db dell’Entity originale. Per farlo è possibile impostare ConcurrencyMode="Fixed" nella definzione della Property nel conceptual model.