Mam aplikacji formularza systemu Windows z .NET 4 i Entity Framework dla warstwy danych muszę jedną metodę z transakcji, ale dokonywania prostych testów nie mogłem zrobić to pracaZakres Transakcja z Podmiotem
W BLL:
public int Insert(List<Estrutura> lista)
{
using (TransactionScope scope = new TransactionScope())
{
id = this._dal.Insert(lista);
}
}
W DAL:
public int Insert(List<Estrutura> lista)
{
using (Entities ctx = new Entities (ConnectionType.Custom))
{
ctx.AddToEstrutura(lista);
ctx.SaveChanges(); //<---exception is thrown here
}
}
"Podstawowym dostawcą powiodło się na Open."
Ktoś ma jakieś pomysły?
problem został rozwiązany - moje rozwiązanie
I rozwiązać mój problem robi pewne zmiany. W jednym z moich DAL używam Wstawiania zbiorczego i innych elementów. Wystąpiła problem z transakcją polegającą na tym, że większość transakcji (sql transakcji) nie rozumiała zakresu transakcji Tak więc oddzieliłem jednostkę w DAL i wykorzystałem transakcję sql w jej trywialnym działaniu. ExecuteScalar();
Uważam, że nie jest to najbardziej elegancka metoda, ale rozwiązałem problem z transakcją.
Oto kod mojego 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();
}
}
}
dzięki za pomoc
możliwe duplikat [Bazowego operatora nie powiodła się otwarty] (http://stackoverflow.com/questions/2475008/the-underlying-provider-failed-on-open) Ma kilka dobrych sugestii dotyczących połączeń/transakcji/DTC –
Używasz tutaj wzorca antypoślizgowego. Traktuj ObjectContext jako jednostkę pracy. – usr