Entity framework... un minimo di cache faceva schifo?

di Andrea Zani, in .NET,

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:

diagramma tabelle

L'entity framework crea il tutto in modo corretto:

ado entity

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.

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