Entity framework... un minimo di cache faceva schifo?
Leggero. Continuano dei test a tempo perso con l'entity framework. Siccome volevo legare delle proprietà ad una tabella per vedere il comportamento dell'EF (lo chiamo così amichevolmente perché inizio ad avere confidenza con questa tecnologia), ho creato una struttura simile a questa:
L'entity framework crea il tutto in modo corretto:
Nella tabella colors sono presenti dei record così composta:
| Id | Color |
| 1 | Black |
| 2 | White |
| 3 | Red |
Per inserire in Articles nuovi record con un colore corrispondente, mi basta scrivere il codice:
using (TestModel.TestEntities context = new TestModel.TestEntities())
{
var a = new TestModel.Articles();
a.Article = "Art " + DateTime.Now.ToString();
var c = context.Colors.Where(w => w.Color == "White").First();
a.Colors = c;
context.SaveChanges();
}
Tutto funziona bene. Con il profiler vedo che esegue una prima query per sapere l'id del colore che sarà poi utilizzato per l'inserimento nella tabella Articoles. A chiunque sarebbe venuto lo stesso sospetto che è venuto a me: nel caso caso di inserimento di più oggetti Articles, avendo richiedendo lo stesso colore, come si comporta l'EF?
Ipotizzando questo codice:
using (TestModel.TestEntities context = new TestModel.TestEntities())
{
string colore = "White";
var a = new TestModel.Articles();
a.Article = "Art " + DateTime.Now.ToString();
var c = context.Colors.Where(w => w.Color == colore).First();
a.Colors = c;
context.SaveChanges();
a = new TestModel.Articles();
a.Article = "Art2 " + DateTime.Now.ToString();
c = context.Colors.Where(w => w.Color == colore).First();
a.Colors = c;
context.SaveChanges();
}
E' per due volte richiesto il colore bianco. Avvio il codice, il tutto è inserito correttamente. Guardo con il profiler... delusione: esegue per ben due volte la query per ottenere l'id del colore. Una possibile soluzione? Crearsi una logica interna di cache... ok, ma un minimo di cache delle entità l'avrei gradita.











