entity-framework - que - insertar registro entity framework c#
DbContext es muy lento al agregar y eliminar (2)
Cuando uso DbContext en un escenario de base de datos descubrí que agregar y eliminar entidades es muy lento en comparación con ObjectContext. Si agrega 2000 entidades y guarda los cambios al final, DbContext es de 3 a 5 veces más lento que ObjectContext (por cierto: sé que sería mejor agregar una gran cantidad de entidades usando SqlBulkCopy, pero ese no es el punto). Si el ahorro cambia después de cada adición, DbContext es casi dos veces más lento. Cuando se trata de eliminación, incluso empeora: al guardar al final de todas las eliminaciones de entidades, DbContext es alrededor de 18 veces más lento que ObjectContext.
Tomé mi aplicación de prueba altamente desarrollada que uso para comparar tecnologías de acceso a la base de datos y una pequeña aplicación de consola para verificar. Ambos mostraron malos resultados para agregar y eliminar entidades usando DbContext. Estos son los resultados de la aplicación de la consola:
Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes at the end: 261ms
Deleting 2000 entities via DbContext saving changes after each object deletion: 25536ms
Deleting 2000 entities via ObjectContext saving changes after each object deletion: 2110ms
Intenté usar EF 4.3 en VC 2010 y EF 5.0 Beta 2 en VS 11 con casi los mismos resultados. Utilicé las plantillas T4 proporcionadas por el "EF 4.x POCO Entity Generator for C #", el "EF 4.x DbContext Generator for C #" y el "EF 5.x DbContext Generator for C #".
¿Qué podría estar mal? De acuerdo con los resultados de las pruebas, nunca usaría DbContext en una aplicación que tenga que agregar o eliminar entidades (lo que hace que DbContext me resulte desafortunadamente inutilizable).
Puse las aplicaciones de prueba de la consola en mi servidor web: EF 4.3 DbContext Test , EF 5.0 DbContext Test
Cualquier idea / corrección es apreciada.
En EF6 ahora puede usar AddRange y RemoveRange en DbSet .
De a la documentación en los enlaces:
Tenga en cuenta que si AutoDetectChangesEnabled se establece en true (que es el valor predeterminado), DetectChanges se invocará una vez antes de {agregar, eliminar} cualquier entidad y no se volverá a llamar. Esto significa que, en algunas situaciones, {Agregar, Eliminar} Rango puede funcionar mucho mejor que llamar {Agregar, Eliminar} varias veces lo haría.
Intenta agregar esto a tus pruebas de DbContext:
dbContext.Configuration.AutoDetectChangesEnabled = false;
// Now do all your changes
dbContext.ChangeTracker.DetectChanges();
dbContext.SaveChanges();
e intenta ejecutar tus pruebas nuevamente.
Hubo algunos cambios arquitectónicos en la API DbContext que verifica los cambios en las entidades cada vez que Add
, Attach
o Delete
algo del contexto. En ObjectContext API, esta detección solo se ejecuta cuando activa SaveChanges
. Es la mejor solución para la mayoría de los escenarios comunes, pero requiere un manejo especial para el procesamiento masivo de datos.