Al final está saliendo una lista interesante de tips a tener en cuenta, y la verdad, cuando empecé a escribir esto no tenía intención que fuera tan grande, tendré que ponerlo blanco sobre negro y hacer un articulo para Krasis y Scribid :-).
Este último va a ser el más sencillo de todos, aunque seguramente para entenderlo hay que saber algunas cosas de infraestructura de EF, que ya comentamos en algunos post como aquí y aquí. Cada unos de los objetos de consulta de los que se dispone dentro de nuestros contextos de trabajo generados por Entity Framework poseen una propiedad llamada MergeOption la cual nos permite establecer que criterio deseamos establecer con respecto al seguimiento de las entidades consultadas. Algunas de las opciones de este enumerado están indicadas para el tratamiento de concurrencia como PreserveChanges y OverwriteChanges, pero básicamente las opciones a discutir son si se realiza seguimiento de las entidades o no, AppendOnly o NoTracking. En escenarios dónde los contextos tienen ciclos de vida cortos, Short Lived Context, el uso del seguimiento de las entidades no aporta nada más que una sobrecarga que generalmente no necesitamos, la sobrecarga viene de los distintos ObjectStateEntry generados cuando tenemos seguimiento. Por eso, una recomendación facil de implementar y que nos puede aportar bastantes cosas es hacer que los distintos objetos de consulta ( ObjectSet u ObjectQuery, como les queráis llamar ) tengas establecida la opción NoTracking
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
IObjectSet<TEntity> CreateObjectSet() { <span class="kwrd">if</span> (_context != (IContext)<span class="kwrd">null</span>) { IObjectSet<TEntity> objectSet = _context.CreateObjectSet<TEntity>(); <span class="rem">//set merge option to underlying ObjectQuery</span> ObjectQuery<TEntity> query = objectSet <span class="kwrd">as</span> ObjectQuery<TEntity>; <span class="kwrd">if</span> ( query != <span class="kwrd">null</span> ) <span class="rem">// check if this objectset is not in memory object set for testing</span> query.MergeOption = MergeOption.NoTracking; <span class="kwrd">return</span> objectSet; } <span class="kwrd">else</span> <span class="kwrd">throw</span> <span class="kwrd">new</span> InvalidOperationException(Resources.Messages.exception_ContainerCannotBeNull); } |
1 |
|
1 |
Saludos |
1 |
Unai Zorrilla |
Después de una serie un poco grande de post sobre una temática concreta siempre está bien hacer una pequeña