Comandos de base de datos por lotes en Entity Framework 4.0

Mi proyecto actual requiere sincronización diaria con un sistema externo. La sincronización se basa en una estructura compleja de archivos de importación que se analiza y procesa con una amplia lógica comercial. Debido a la lógica comercial, decidimos hacer esto en código .NET y reutilizar los componentes BL existentes en lugar de escribir la misma lógica en procedimientos almacenados o servicios de integración.

La capa BL se encuentra sobre la capa de acceso a datos EF 4.0. El proceso de implementación actual incluye el lote de importación, rellena todos los cambios en ObjectContext y ejecuta SaveChanges en la transacción. Cuando verifico SQL profiler, veo que EF ejecuta cada cambio de entidad como un solo comando SQL (con su propio viaje de ida y vuelta a DB). Además, parece que estos comandos se ejecutan de forma totalmente secuencial. Así que tengo hasta 100.000 viajes de ida y vuelta a la base de datos para la importación inicial y entre 10.000 – 50.000 viajes de ida y vuelta a la base de datos para la sincronización diaria.

¿Es posible insertar / actualizar / eliminar comandos de algún modo por EF mismo o por algún proveedor / extensión?

    No, no se puede hacer (sí, yo también lloro).

    EF no admite operaciones por lotes, LINQ-SQL tuvo (tiene) el mismo problema.

    Tienes algunas opciones:

    1. Procedimientos almacenados
    2. Classic ADO.NET o EntitySQL
    3. Disparadores

    Me he ido con la opción 1 y 3 en el pasado.

    El problema con los tres enfoques es que pierdes la abstracción EF, el gráfico interno (concurrencia optimista) y vuelves al mundo del SQL nativo.

    Tenga en cuenta este proyecto: magiq.codeplex.com

    Lleva las operaciones por lotes a linq-to-sql y ahora estamos trabajando en el soporte de EntityFramework.

    Aclamaciones

    Hay algunas soluciones en SQL Server:

    • Las inserciones por lotes se describen en el artículo de Entity Framework Bulk Copy

    • Las Actualizaciones por lotes (y las Eliminaciones) se describen en las Actualizaciones de entidades múltiples con Entity Framework – Artículo de Actualizaciones de obtención de EF .

    En caso de que esté interesado en Oracle, MySQL, POstgreSQL o SQLite, puede usar los últimos proveedores de Devart dotConnect . La funcionalidad BatchUpdates ya está integrada en el método SaveChanges en las últimas versiones de estos proveedores.

    Esta es una forma que le permite usar su código POCO primero y es rápido. Subió una inserción a granel de> 1 hora a ~ 5 segundos.

    SqlBulkCopy para la lista genérica (útil para Entity Framework y NHibernate) .

    Solo compartiendo contigo un proyecto de GitHub solo para eso, a partir de ahora, es compatible con Bulk insert / update / delete para el servidor Sql de forma transparente utilizando SqlBulkCopy. https://github.com/MHanafy/EntityExtensions También hay otras cosas buenas, y con suerte, se extenderá para hacer más en la pista. Usarlo es tan simple como

    var insertsAndupdates = new List(); var deletes = new List(); context.BulkUpdate(insertsAndupdates, deletes); 

    ¡Espero eso ayude!