Ho un'applicazione Windows Form con .NET 4 e Entity Framework per lo strato di dati ho bisogno di un metodo con la transazione, ma fare semplici test non ho potuto farlo funzionaretransazione Scope con Entity
In BLL:
public int Insert(List<Estrutura> lista)
{
using (TransactionScope scope = new TransactionScope())
{
id = this._dal.Insert(lista);
}
}
In DAL:
public int Insert(List<Estrutura> lista)
{
using (Entities ctx = new Entities (ConnectionType.Custom))
{
ctx.AddToEstrutura(lista);
ctx.SaveChanges(); //<---exception is thrown here
}
}
"Il provider sottostante fallito su Open."
Qualcuno ha qualche idea?
problema risolto - la mia soluzione
ho risolto il mio problema facendo alcuni cambiamenti. In uno dei miei DAL uso un inserto di massa e altre entità. La transazione problematica stava avvenendo per il fatto che la maggior parte della transazione (transazione sql) non comprendeva lo scope della transazione Quindi ho separato l'entità in DAL e usato la transazione sql nella sua esecuzione un po 'banale. ExecuteScalar();
Credo che non sia il modo più elegante per farlo, ma ho risolto la mia transazione problematica.
Ecco il codice della mia 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();
}
}
}
grazie per l'aiuto
possibile duplicato del [Il provider sottostante non è riuscita su Open] (http://stackoverflow.com/questions/2475008/the-underlying-provider-failed-on-open) Ha alcuni buoni suggerimenti relativi a connessioni/transazioni/DTC –
Si sta utilizzando un anti-pattern qui. Tratta l'ObjectContext come unità di lavoro. – usr