Speeindg up Entity Framework Inserts




 Estoy trabajando en un sistema de pedidos que puede tener de 1 a 200 o más pedidos. Ahora mismo tenemos un bucle que recorre cada orden y lo inserta en la base de datos. ¿Tendría sentido usar SqlBulkCopy? ¿Usarlo degradaría el rendimiento en pedidos pequeños? ¿Existen otras técnicas para acelerar las inserciones? 

 ¡Gracias!
Básicamente hay varias cosas que puedes hacer. 

* usando `SqlBulkCopy.WriteToServer` que no funciona muy bien junto con EF, sin embargo, existen varios intentos para crear extensiones
* utilizando un procedimiento almacenado que tomará un registro grande y lo dividirá de acuerdo con alguna lógica
* utilizando parámetros de procedimiento almacenado escritos en la tabla y realice una llamada al procedimiento almacenado (y varias `insert ... select` dentro del procedimiento almacenado)

 En general, prefiero la tercera opción. 

 Marque esta pregunta [Entity Framework Stored Procedure Tabla Valor Parámetro](https://stackoverflow.com/questions/8157345/entity-framework-stored-procedure-table-value-parameter)
Recibí una respuesta de Brice Lambson que trabaja en el equipo central de EF: 


>  Vas en la dirección correcta: abre las conexiones menos. Recuerde, las conexiones SQLite son esencialmente secuencias de archivos, por lo que mantenerlas abiertas por más tiempo no es realmente un problema. 
> 
>  **Si solo hay una instancia de DbContext por conexión, DbContext aún puede ser propietario de la conexión, incluso si se crea externamente. Simplemente disponga la conexión dentro de DbContext.Dispose ().** 
> 
>  Si eso no es suficiente, puede intentar crear un grupo de conexiones. La gestión de la vida puede ser difícil. Lo importante es que una conexión no se usa fuera del hilo en el que se creó. 
> 
>  El uso de Cache = Shared (es decir, [Shared-Cache Mode](https://www.sqlite.org/sharedcache.html) ) también puede ayudar al rendimiento. 
> 
> El autor de este artículo está algo equivocado: en .NET 4.5, la propiedad [AsynchronousProcessing](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.asynchronousprocessing.aspx) se ignora porque ya no es necesaria. Puede comenzar a [llamar a los métodos Async](http://msdn.microsoft.com/en-us/library/hh211418.aspx) de SqlClient sin cadenas de conexión especiales. 

 Si las operaciones se ejecutarán de forma asíncrona, depende del proveedor de la base de datos. Por ejemplo, la implementación predeterminada de [DbCommand.ExecuteDbDataReaderAsync en](http://msdn.microsoft.com/en-us/library/system.data.common.dbcommand.executedbdatareaderasync.aspx) realidad se ejecuta de forma síncrona y bloquea el hilo de llamada. SqlCommand anula este método y se ejecuta de forma asíncrona. 

 Desafortunadamente, NpgsqlCommand no anula este método, por lo que solo le queda la ejecución síncrona. Si te explicas, el problema es que la función se tendría que aplicar a cada ciertos rangos y dependiendo de los datos en las celdas se podrá o no sumar.  
No entiendo por qué pones datos en esta forma, lo siento un poco desordenado. Para cuestiones de análisis es mejor que los datos estén continuos. Si lo que tienes son grupos de datos puedes utilizar la función =Sumar. Si() o =Contar. Si().  
Cualquier cosa me mandas un ejemplo de tu archivo y trato de orientarte. Claro, con todo gusto el programa que uso es el pinnacle INSTANT Photoalbum, es muy buen programa porque ademas de lo que tu solicitas te da la opicon de poner textos o numeración que deseas que aparezca, Algo myu importante es que previamente estandarices el tamaño de las fotos para que tenga mejor capacidad el disco, hasta donde he usado el programa he montado 136 con efectos y música.  
Pero ojo:  
Una vez hecho en este programa NO es posible envialras a quemar o sacar copias de las imágenes pues hace un archivo ejecutable.  
Así que si lo quieres para acabado final, entonces ese es tu programa, suerte y no olvides evaluarme  
Barin Monterrey Los ejemplos que otros han dado no funcionarán en Entity Framework hoy, porque no se pueden combinar enumeración de clientes y servidores en las entidades LINQ 2. 

 En su lugar, necesita construir una expresión OR, manualmente. 

 Ejecuto una serie de [consejos](http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx) de [EF](http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx) y [este consejo](http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx) te muestra cómo construir una expresión OR. 

 Espero que esto ayude 

 Alex Tu pregunta es muy amplia, ya que existen varias formas de hacerlo.  
Pero te pido que me pases tu nivel de experiencia así se lo que te puedo recomendar, para que empieces te aconsejo que uses Textboxes, ComboBoxes, y Labels.  
Y para almacenar dichos datos en una base de datos, podes utilizar el Access para crearla, y desde VB utilizar un DataControl para enlazar la base de datos a tu programa. Contestame lo que te pregunte que te doy más ejemplos. ¿Dale?. Si le gustan las cosas que se ven bien, como las clases de POCO, y también quiere la velocidad de MicroORM, entonces debe comprobar, [ServiceStack OrmLite](https://github.com/ServiceStack/ServiceStack.OrmLite) . Incluso puedes usar Massive o Dapper. Solo un uso de eso será diferente. 

 Pero una cosa es segura, Code será menos y la velocidad es como cualquier otra cosa. Avíseme si necesita algún fragmento de código. Simplemente ve a través de los sitios de github, eso te ayudará. *Nota: la respuesta se proporcionó en un comentario en la pregunta original. Solo le estoy agregando un poco aquí, para hacerlo más visible y claro.* 





 Entity Framework obviamente asigna clases de C # a tablas de bases de datos a través de propiedades que representan las distintas columnas en cada tabla. Ahora, si el tipo de datos de una de estas propiedades no es compatible con el tipo de datos de su columna correspondiente en la base de datos, obtendrá una `System.InvalidCastException` cuando intente recuperar algo de esa tabla, incluso si la propiedad no coincide no está directamente involucrada en la búsqueda 

 En la pregunta, la consulta fue: 


```
User user = context.Users.First(i => i.UserId == id);

```
  No importa que tanto `id` como su propiedad correspondiente `UserId` sean válidas y compatibles entre sí aquí, porque lo que se está buscando es una instancia de toda la clase de `User` . 

 Aparentemente, el tipo de alguna otra propiedad en el `User` es incompatible con el tipo una columna con el mismo nombre en la tabla de `user` en la base de datos, por lo que el intento de mapearlo arroja la excepción anterior. Tienes que usar la función BUSCARV para que en función de un valor busques en la primera columna de tu otra tabla, e indicándole el número de columna consigas el dato deseado.

Otra opción es usar las funciones INDICE e COINCIDIR.

En Internet y Youtube hay muchos tutoriales, el propio Excel tiene también ejemplos.

Desafortunadamente con la información que proporcionas no veo como orientarte de manera más específica. y apoyando mas la aportacion de made in china... te dejo este enlace:  
  
<http://www.elguille.info>  
  
me imagino que vas a modificar base de datos verdad?  
  
en realidad no es tan dificil... te lo comento muy general  
  
- creas las tablas con access y las pones en la pc que hara la de servidor.  
- realizas tu aplicacion normal, como si fueras a trabajar local(en una sola maquina). solo ten el cuidado de manejar alias, es decir... direcciona la base de datos con alias.  
- luego instala la aplicacion en todas las pc que te van a utilizar el sistema  
- mapea la tabla que esta el servidor  
- conecta en todas las pc la unidad de red(direccionada a la unidad mapeada)  
- crea el alias en las maquinas que van a usar el sistema  
  
listo..  
  
precauciones que debes de tomar:  
- integridad referencial(si es necesaria)   
- otorgar permisos de escritura a la tabla  
- tomar en cuenta el bloque de registros y el bloqueo de tablas.  
  
si lo que quieres es comunicar 2 pc por el puerto de red(cliente-servidor) entonces lee todo lo que puedas sobre el winsock.  
  
saludos.... ![wink](/ckeditor/plugins/smiley/images/icon_wink.gif) sigue valorando las respuestas