2010-12-10 14 views
14

Mi proyecto actual requiere la sincronización diaria con el 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.Comandos de base de datos por lotes en Entity Framework 4.0

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 por lotes de alguna manera por EF mismo o por algún proveedor/extensión?

Respuesta

8

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

EF no es compatible con las operaciones por lotes, LINQ-SQL tenía (tiene) el mismo problema.

Usted tiene algunas opciones:

  1. procedimientos almacenados
  2. ADO.NET clásico o EntitySQL
  3. disparadores

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

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

+0

Así que tendré que vivir con mi solución actual porque reescribir la solución no es una opción. :( –

+2

Sí. EF no está diseñado para el trabajo por lotes. Y especialmente algo así como un "lote de importación": es una preocupación de la base de datos, no una preocupación ORM. Ni siquiera estaría usando EF para esto, tendría un servicio separado (por ejemplo, WCF - alojado como servicio de Windows) cuya única responsabilidad sería importar estos datos masivos cuando se requiera sincronización. separación de inquietudes. mi proyecto anterior también requería sincronización de DB con el nuestro y externo. usamos el servicio de Windows (antes wcf días). – RPM1984

3

estar al tanto de este proyecto: magiq.codeplex.com

Trae operaciones por lotes a LINQ a SQL y estamos trabajando en apoyo ADO.NET Entity Framework por ahora.

Saludos

+0

Es una gran noticia. Gracias. –

+0

El último compromiso en este proyecto fue el 1 de octubre de 2012 :( –

3

Hay algunas soluciones en SQL Server:

En caso de estar interesado en Oracle, MySQL, PostgreSQL o SQLite, se puede utilizar la última Devart dotConnect providers. El BatchUpdates functionality ya está integrado en el método SaveChanges en las últimas versiones de estos proveedores.

0

Solo compartiendo contigo un proyecto de GitHub solo por 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. uso es tan simple como

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

espero que ayude!

Cuestiones relacionadas