que tiene una aplicación de Windows Forms con .NET 4 y Marco de la entidad para la capa de datos Necesito un método con la transacción, pero haciendo pruebas simples que no podía hacer que funcioneTransacción Ámbito Entidad con
En BLL:
public int Insert(List<Estrutura> lista)
{
using (TransactionScope scope = new TransactionScope())
{
id = this._dal.Insert(lista);
}
}
en DAL:
public int Insert(List<Estrutura> lista)
{
using (Entities ctx = new Entities (ConnectionType.Custom))
{
ctx.AddToEstrutura(lista);
ctx.SaveChanges(); //<---exception is thrown here
}
}
"El proveedor subyacente no se ajustó en Abrir."
¿Alguien tiene alguna idea?
problema resuelto - Mi solución
he resuelto mi problema en hacer algunos cambios. En uno de mis DAL utilizo un Bulk Insert y otros Entity. La transacción problema estaba ocurriendo por el hecho de que el grueso de la transacción (transacción sql) no comprende un alcance de transacción Así que separé la entidad en DAL y usé la transacción sql en su ejecución de forma trivial. ExecuteScalar();
Creo que esa no es la forma más elegante de hacerlo, pero solucionó mi problema de transacción.
Aquí está el código de mi DAL
using (SqlConnection sourceConnection = new SqlConnection(Utils.ConnectionString()))
{
sourceConnection.Open();
using (SqlTransaction transaction = sourceConnection.BeginTransaction())
{
StringBuilder query = new StringBuilder();
query.Append("INSERT INTO...");
SqlCommand command = new SqlCommand(query.ToString(), sourceConnection, transaction);
using (SqlBulkCopy bulk = new SqlBulkCopy(sourceConnection, SqlBulkCopyOptions.KeepNulls, transaction))
{
bulk.BulkCopyTimeout = int.MaxValue;
bulk.DestinationTableName = "TABLE_NAME";
bulk.WriteToServer(myDataTable);
StringBuilder updateQuery = new StringBuilder();
//another simple insert or update can be performed here
updateQuery.Append("UPDATE... ");
command.CommandText = updateQuery.ToString();
command.Parameters.Clear();
command.Parameters.AddWithValue("@SOME_PARAM", DateTime.Now);
command.ExecuteNonQuery();
transaction.Commit();
}
}
}
gracias por la ayuda
posible duplicado de [El proveedor subyacente falló en Abrir] (http://stackoverflow.com/questions/2475008/the-underlying-provider-failed-on-open) Tiene algunas buenas sugerencias relacionadas con conexiones/transacciones/DTC –
Aquí está usando un antipatrón. Trate el ObjectContext como una unidad de trabajo. – usr