title: Bulk inserts with EntityFramework 4.0 causes abort of transaction
body: <p>We are receiving a file from a client (Silverlight) via WCF and on the serverside I parse this file. Each line in the file is transformed into an object and stored into the database. if the file is very large (10000 entries and more), I get the following error (MSSQLEXPRESS):</p>
  
  <p>The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements. </p>
  
  <p>I tried a lot (TransactionOptions timeout set and so on), but nothings works. The above exception message is either raised after 3000, sometimes after 6000 objects processed, but I can't succeed in processing all objects.</p>
  
  <p>I append my source, hopefully somebody got an idea and can help me:</p>
  
  <pre><code>public xxxResponse SendLogFile (xxxRequest request
  {
     const int INTERMEDIATE_SAVE = 100;
  
  
  
     using (var context = new EntityFramework.Models.Cubes_ServicesEntities())
     {
              // start a new transactionscope with the timeout of 0 (unlimited time for developing purposes)
              using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,
              new TransactionOptions
              {
                  IsolationLevel = System.Transactions.IsolationLevel.Serializable,
                  Timeout = TimeSpan.FromSeconds(0)
              }))
              {
                  try
                  {
                      // open the connection manually to prevent undesired close of DB
                      // (MSDTC)
                      context.Connection.Open();
                      int timeout = context.Connection.ConnectionTimeout;
  
                      int Counter = 0;
  
                      // read the file submitted from client
                      using (var reader = new StreamReader(new MemoryStream(request.LogFile)))
                      {
                          try
                          {
                              while (!reader.EndOfStream)
                              {
                                  Counter++;
                                  Counter2++;
                                  string line = reader.ReadLine();
                                  if (String.IsNullOrEmpty(line)) continue;
  
                                  // Create a new object
                                  DomainModel.LogEntry le = CreateLogEntryObject(line);
  
                                  // an attach it to the context, set its state to added.
                                  context.AttachTo("LogEntry", le);
                                  context.ObjectStateManager.ChangeObjectState(le, EntityState.Added);
  
                                  // while not 100 objects were attached, go on
                                  if (Counter != INTERMEDIATE_SAVE) continue;
  
                                  // after 100 objects, make a call to SaveChanges.
                                  context.SaveChanges(SaveOptions.None);
                                  Counter = 0;
                              }
                          }
                          catch (Exception exception)
                          {
                              // cleanup
                              reader.Close();
                              transactionScope.Dispose();
                              throw exception;
  
                          }
  
                      }
                      // do a final SaveChanges
                      context.SaveChanges();
                      transactionScope.Complete();
                      context.Connection.Close();
                  }
                  catch (Exception e)
                  {
                      // cleanup
                      transactionScope.Dispose();
                      context.Connection.Close();
                      throw e;
                  }
              }
  
              var response = CreateSuccessResponse&lt;ServiceSendLogEntryFileResponse&gt;("SendLogEntryFile successful!");
              return response;
          }
      }
  </code></pre>