BeginTransaction con IsolationLevel en EF Core




 Estoy tratando de reescribir una biblioteca antigua para usar EntityFramework Core y no puedo entender cómo comenzar la transacción con un nivel de aislamiento específico. 

 Anteriormente pude hacer algo como esto: 


```
DbContext.Database.BeginTransaction(IsolationLevel.Snapshot);

```
  ¿Qué es la implementación alternativa en EntityFramework Core?
El código de EF Core es exactamente el mismo. 


```
DbContext.Database.BeginTransaction(IsolationLevel.Snapshot);

```
  La única diferencia es que en EF Core el [método con nivel de aislamiento](https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.begintransaction?view=efcore-2.1) (como muchos otros) es un método de *extensión* , definido en la clase [RelationalDatabaseFacadeExtensions](https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions?view=efcore-2.1) , y lo más importante, ubicado en [Microsoft.EntityFrameworkCore.Relational](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/) ensamblado. 

 Entonces, si ha `using Microsoft.EntityFrameworkCore;` y no lo vea, agregue referencia al ensamblado / paquete `Microsoft.EntityFrameworkCore.Relational.dll` .
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) 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 El equipo de EF, junto con P&P, se encuentra actualmente en el proceso de desarrollar una implementación de referencia de acceso a datos de EF (versión 4) que utiliza ASP.NET MVC como la interfaz. 

 El proyecto estará disponible de forma iterativa en CodePlex aquí: 

 <http://dataguidance.codeplex.com/> 

 Aún no hemos hecho nuestra primera fuente, pero ocurrirá en las próximas semanas. 

 ACTUALIZACIÓN: ahora hemos eliminado el código; tenga en cuenta que debe considerarse de calidad alfa y está sujeto a cambios. 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. vea este artículo <http://msdn.microsoft.com/en-us/library/bb738695.aspx> y <http://msdn.microsoft.com/en-us/library/bb386870.aspx> muestra acerca de la actualización con EF.   
 Y esta pregunta SO sobre ApplyCurrentValues: [ApplyCurrentValues en EF 4](https://stackoverflow.com/questions/2272325/applycurrentvalues-in-ef-4) para ver cómo trabajar con AppliCurrentValues. En pocas palabras: LINQ to Entities no conoce la conversión de su tipo de ID a una cadena. 

 ¿Cuál es el tipo de `c.ID` ? ¿Hay alguna razón por la que sea un tipo para ID, pero otro para `ReferenzId` ? Si es posible, conviértalos en el mismo tipo, en cuyo punto ya no tendrá más problemas. No sé si hay otras formas de realizar conversiones en LINQ a Entidades (puede haber), pero la alineación de los tipos sería más clara. 

 Por cierto, esto realmente parece que es una combinación: 


```
var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

```
  EDITAR: Para responder a su comentario: `ToString` aparece en IntelliSense porque el compilador no tiene una idea real de lo que va a significar su consulta ni de cómo se traducirá. Es perfectamente válido C #, y puede generar un árbol de expresiones válido. Es solo que EF no sabe cómo convertir ese árbol de expresiones en SQL. 

 Puede *intentar* usar `Convert.ToString(c.Id)` lugar de simplemente llamar a `c.Id.ToString()` ... Se puede extraer información de archivos, utilizando un DTP (Data Transformation Package), en el Enterprise Manager, selecciona tu servidor, y después la opción: Data Transformation Services, sobre la opción Local Package, oprime el botón derecho y luego la opción New Package. Un DTP, se crea en forma gráfica, solo necesitas seleccionar el icono de archivo de texto fuente y el icono Microsoft Ole DB Provider for SQL Server. Posteriormente seleccionas oprimiendo la tecla Control, el icono de archivo de texto fuente y después sin soltarla el icono de Microsoft Ole DB provider for SQL Server. En la parte de arriba oprime la opción: Transform Data Task, aparecerá una flecha entre ambas conexiones. Le debes de dar doble click sobre esta flecha y especificar las opciones de Origen y destino. Así como que campos corresponden con las columnas del archivo de texto. Por ultimo para ejecutarlo oprime la flecha verde. nada que ver. ecc (error-correcting code memory). se trata de un sistema para detectar y corregir los tipos m&aacute;s comunes de corrupci&oacute;n de datos. <br/><br/>pruebe con una memoria markvision, a ver que pasa. <blockquote class='decoda-quote'> <div class='decoda-quote-head'> <span class='decoda-quote-author'> chelohahn escribió: </span> <span class='clear'></span> </div> <div class='decoda-quote-body'> <blockquote class='decoda-quote'> <div class='decoda-quote-head'> <span class='decoda-quote-author'> ivanluujoa escribió: </span> <span class='clear'></span> </div> <div class='decoda-quote-body'> por supuesto, puedes usarla con un interruptor para encenderla o apagarla durante el d&iacute;a, pero por la noche estar&aacute; encendida si o s&iacute;. o viceversa. </div></blockquote><br/><br/>gracias por contestar creo que no se entendio a que me refer&iacute;a. al ser una lampara de exterior la idea es que se utilice de noche.. es para un patio donde eventualmente necesito que la lampara quede encendida como una lampara comun. otras veces necesito que solo se active cuando detecte movimiento. en este momento tengo una lampara comun con su interruptor correspondiente. la idea es cambiarla por una lampara que tenga las dos caracteristicas. se entiende? </div></blockquote><br/><img src='http://static.yoreparo.com/imagenes/subidas/sensor-movimiento-con-llave.jpg' alt='' /><br/>puedes realizar este circuito.<br/>cuando detecte movimiento se encender&aacute;! y adem&aacute;s podr&aacute;s encenderla cuando no haya movimiento.<br/>pero si lo que quieres es apagarla y que ni siquiera prenda con el sensor de movimiento, puedes ponerle antes de llegar al interuptor, una t&eacute;rmica solamente para esta luz.<br/>o puedes colocar en vez de una sola tecla, colocar 2! una que corte la fase antes de pasar por la tecla de encendido y el sensor.<br/>saludos! *Cattelan Piel En Italia Comedor 2019Lindos Sofá De Silla Magda rdoeCBx*Me da la impresión de que iterparse es lo que quieres. Mirando
la sección "Eventos de etiqueta selectiva" en [http://lxml.de/parsing.html](/parsing.html) parece que
eso te da lo que deseas:



```
context = etree.iterparse(xmlfile, tag="yourSubTree")
action, elem = context.next()
etree.iterwalk(elem, ...)...

```

Parece que XPath también podría funcionar, pero supongo que
XPath lee en todo el árbol antes de regresar, mientras que yo
esperaría que iterparse caminara solo hasta que tuviera una
coincidencia. Valdría la pena perfilar los dos enfoques.