Il linguaggio Visual Basic di Microsoft
 

Entity Framework con entità disconnesse

Andrea (Work) 2 Ott 2015 17:36
Buongiorno a tutti,
mi sono scontrato con EF in modalità disconnessa.
Ovvero carico un oggetto, chiudo il context, al salvataggio apro un nuovo
context e tento di reinserirlo nel database.

In inserimento bene o male si riesce, in modifica, con le proprietà
correlate, ci sono diversi problemi.

Supponiamo di avere un oggetto commessa con relazionato il cliente, una
tabella di righe, ed una tabella opzionale 1...0-1 che sono i dettagli
commessa che ci possono essere

| Dim comm as mia commmessa
| comm.Subject=txtSubject.text

Se si usa il metodo 1)
| ctx.CommessaSet.Add(comm)
Lui preimposta tutti le relazioni del grafo su Added. Quindi tenta di
inserirmi anche il cliente, e quindi uno deve esplicitare tutte le entità:
| ctx.Entry(comm.Cliente).State = Entity.EntityState.Unchanged
ecc.

Il problema è che se nella maschera per qualche motivo vado anche solo a
leggere una sottoproprietà, poi mi devo ricordare che *probabilmente* il
salvataggio darà errore. Questo per me è inammissibile.

Allora si consiglia di fare 2):
| ctx.Entry(comm).State = Entity.EntityState.Modified
Questo lascia tutti gli oggetti relazionati su Unchanged. Quindi uno pensa
che basti mettere le cose che gestisce nel giusto modo ed è a posto.
In realtà se io vado a generare delle righe di commessa, queste hanno tutte
Id=0 ovviamente, devo ricordarmi di dirgli prima del modified che cosa sto
facendo.
E' accettabile, ma non capisco perchè mi mette il vincolo di farlo prima
| For Each lb In comm.CommessaDetail
| If lb.Id > 0 Then
| ' non permetto modifica dei dati nello specifico
| ctx.Entry(lb).State = Entity.EntityState.Unchanged
| Else
| ctx.Entry(lb).State = Entity.EntityState.Added
| End If
|
| Next


La modalità 3) è quella di applicare le modifiche, su oggetto nuovo:
| Using ctx As New AriModelContainer
| Dim oldComm As Commessa = ctx.CommessaSet.Find(comm.Id)
|
| If oldComm Is Nothing Then
| ctx.Entry(comm).State = EntityState.Added
| Else
| ctx.Entry(oldComm).CurrentValues.SetValues(comm)
| End If
| ctx.SaveChanges()
| End Using

Questo mi sembra che funzioni, soltanto non mi applicava le variazioni
sulle entità correlate, nemmeno esplicitandole, ma ammetto di non averci
perso più di tanto tempo.

Ho fatto dei test anche con l'attach, ma se non erro c'erano problemi, che
fra il milione di modifiche non ricordo.

Poi ho provato a non disconnettere, e cioè il context aperto all'inizio
della form e poi chiuso al salvataggio, tutto liscio senza nessun problema.

Nel caso però che l'oggetto mi arrivi invece che dalla winform, da un
tablet verso un servizio o altro questa modalità non si può usare presumo.

Voi come avete approcciato il problema?
Ho letto che EF7 avrà miglior supporto delle entità disconnesse con un
metodo AttachGraph.

ps. a chi interessa sono partito da qui:
http://www.entityframeworktutorial.net/EntityFramework5/update-entity-graph-using-dbcontext.aspx

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.