Entity Framework e stranezze(*)

di Andrea Zani, in .NET,

Entity:

 entity

Codice:

// Step 1
var coll2 = (from c in context.Men.Include("Women")
             select c).First();
//
// Visualizza item;
//----------------------------------------------------------------
//
// Step 2
//
coll2.Age++;
coll2.Women.Age++;
//
// Visualizza item;
//-----------------------------------------------------------------
//
// Step 3
//
var coll3 = from c in context.Men.Include("Women")
            select c;
foreach (var item in coll3)
{
    // Visualizza item;
}

Nel primo caso come age della prima entity e della seconda, viene visualizzato il contenuto iniziale della tabella (viene eseguita la query visibile grazie al profiler):

1 e 1

Al secondo step viene visualizzato:

2 e 2

Domanda finale... Che cosa viene visualizzato allo step 3? Do un aiuto, con il profiler è visibile la query di select delle due entity.

Dunque?

Qual è la risposta?

Sto aspettando...

Be', si potrebbe pensare che visualizzi ancora 1 e 1 visto che esegue richiede le due tabella al database che ritornano i valori iniziali (proprio ciò che avviene), ma invece viene visualizzato:

2 e 2!!!

Ma perché esegue la query se alla finfine prende ancora i dati aggiornati in precedenza?

Un attimo di pensieri alterni...

Giungo alla conclusione che esegue queste query con controllare la consistenza dei dati, per vedere se eventualmente il record sul db è stato modificato da qualcosa d'altro. Anzi, oso di più, mi convinco che sia questo il motivo.

Avvio il profiler e l'enterprise manager.

Eseguo i due step, blocco, modifico il record esternamente, e eseguo l'ultimo passo. La query viene eseguita e presi i dati... ma non accade nulla!!! Nulla di nulla!

Non mi arrendo. Modifico le proprietà delle due entity. Imposto Age come Concurrency Mode a Fixed. Riprovo. Non cambia nulla... uff... Per avere aggiornati i dati dobbiamo forzare la cosa:

//
// Step 3
//
var coll3 = from c in context.Men.Include("Women")
            select c;
foreach (var item in coll3)
{
    context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item);
    context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item.Women);
    // Visualizzo dati
}

Buono a sapersi, ma perché la query non la fa in questo caso e solo questo?

(*) La parola strano, che vuol dì? Qualcosa che non è normale, qualcosa al di fuori di ogni schema? Ma in sé, che significa? E' una prola senza significato. Cos'è strano? Ciò che fuori dal normale senso civico e comportamentale? Chi ha creato l'Entity Framework saprà dirmi il perché di questo comportamento che riterrà normale... dunque è strano ciò che penso io! Strano è una parola inutile, da cancellare. Che parola odiosa.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese