Korzystanie z Entity Framework 4.3.1 Baza danych Po pierwsze, jaki jest dobry sposób na częste zatwierdzanie/zapisywanie zmian obiektów w bazie danych? W poniższej części chciałbym zapisać fakturę bezpośrednio po wywołaniu skróconych instrukcji i nie ryzykować czekania na opublikowanie wszystkich faktur. Ale nie mogę wywołać SaveChanges za każdym razem w pętli, to rzuci wyjątek.Częste zapisy ze strukturą encji
Przydałoby się mieć metodę .Save() na każdym obiekcie, być może jest na to dobry sposób?
var unpostedInvoices = entities.GetUnpostedInvoices();
foreach (Invoice invoice in unpostedInvoices)
{
// this takes a long time
var invoiceDto = quickbooks.PostInvoice(invoice);
invoice.Posted = true;
invoice.TransactionId = invoiceDto.TransactionId;
// I'd like to save here rather than after the foreach loop, but this will fail
//entities.SaveChanges();
}
// this works, but I don't want to risk waiting this long to save
entities.SaveChanges();
Jest to wyjątek zgłoszony podczas wywoływania SaveChanges() w pętli.
New transaction is not allowed because there are other threads running in the session.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName)
at System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel iso)
at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.BeginTransaction(IsolationLevel isolationLevel)
at System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)
Jak to się dzieje, gdy wywołujesz 'SaveChanges' w pętli? –
Dodałem wyjątek do pytania. – RyanW