Функция Entity Framework SaveChanges не зафиксирует мои изменения

#sql-server-2008 #entity-framework-4 #savechanges

#sql-server-2008 #entity-framework-4 #savechanges

Вопрос:

У меня есть начальный выбор, который я помещаю в список. Я использую список для циклического просмотра каждой записи, и там, где она соответствует определенным критериям, я выполняю серию вставок, удалений и обновлений. Наконец, вызовите метод SaveChanges() для фиксации изменений.

Код выполняется без создания исключения, но никакие изменения не отражаются в базе данных. Я безуспешно искал в Интернете.

Я использую VS2008 с серверной частью SQL2008.

Пожалуйста, помогите?

             using (SMSEntities db = new SMSEntities())
        {
            try
            {

                //Get SMS's to send from Inbox
                List<Inbox> tmpInbox = (from c in db.Inboxes where c.Status != "NEW" amp;amp; c.Status != "SUCCESS" select c).ToList();// new { Inbox.InboxID, Inbox.StatusTrackingID, Inbox.Status, Inbox.NoOfAttempts, Inbox.CellNo, Inbox.SourceCellNo, Inbox.Header, Inbox.Message, Inbox.MessageDate, Inbox.AccountID, Inbox.LastAttemptDate }).ToList();

                foreach (Inbox tmpInboxIndex in tmpInbox)
                {
                    bool success = false;

                    //Check status here
                    string SentStatus = CheckSMSSentToProvider(tmpInboxIndex.StatusTrackingID);

                    // Define a transaction scope for the operations.
                    using (TransactionScope transaction = new TransactionScope())
                        {
                        try
                        {
                            if ((SentStatus == "DELIVERED") || (SentStatus == "NOTFOUND") || (SentStatus == "DELETED") || (SentStatus == "REJECTED") || (SentStatus == "UNDELIVERED"))
                            {

                                //Insert the Log row
                                Log newLog = new Log();
                                newLog.InboxID = tmpInboxIndex.InboxID;
                                newLog.CellNo = tmpInboxIndex.CellNo;
                                newLog.SourceCellNo = tmpInboxIndex.SourceCellNo;
                                newLog.Message = tmpInboxIndex.Message;
                                newLog.Header = tmpInboxIndex.Header;
                                newLog.MessageDate = tmpInboxIndex.MessageDate;
                                newLog.AccountID = tmpInboxIndex.AccountID;
                                newLog.ProcessedDate = DateTime.Now;
                                newLog.Status = tmpInboxIndex.Status;
                                newLog.StatusTrackingID = tmpInboxIndex.StatusTrackingID;
                                newLog.NoOfAttempts = tmpInboxIndex.NoOfAttempts;
                                newLog.LastAttemptDate = tmpInboxIndex.LastAttemptDate;
                                db.Logs.AddObject(newLog);

                                //Delete the Inbox row
                                if (tmpInbox != null)
                                {
                                    var deleteInbox = (from c in db.Inboxes where c.InboxID == tmpInboxIndex.InboxID select c).FirstOrDefault();
                                    if (deleteInbox != null)
                                    {
                                        db.DeleteObject(deleteInbox);
                                        //db.SaveChanges(SaveOptions.DetectChangesBeforeSave);
                                    }
                                }
                            }
                            else
                            {
                                //Update inbox status 
                                var tmpUpdateInbox = (from c in db.Inboxes where c.InboxID == tmpInboxIndex.InboxID select c).FirstOrDefault();
                                tmpUpdateInbox.Status = SentStatus;
                                tmpUpdateInbox.NoOfAttempts = tmpInboxIndex.NoOfAttempts   1;
                                tmpUpdateInbox.LastAttemptDate = DateTime.Now;
                                //db.SaveChanges(SaveOptions.DetectChangesBeforeSave);
                            }
                            // Mark the transaction as complete.
                            transaction.Complete();
                            success = true;
                            //break;
                        }
                        catch (Exception ex)
                        {
                            // Handle errors and deadlocks here and retry if needed.
                            // Allow an UpdateException to pass through and 
                            // retry, otherwise stop the execution.
                            if (ex.GetType() != typeof(UpdateException))
                            {
                                Console.WriteLine("An error occured. "
                                      "The operation cannot be retried."
                                      ex.Message);
                                break;
                            }
                            // If we get to this point, the operation will be retried.
                        }
                    }

                    if (success)
                    {
                        // Reset the context since the operation succeeded.
                        //db.AcceptAllChanges();
                        db.SaveChanges();
                    }
                }

                // Dispose the object context.
                db.Dispose();

            }

            catch (Exception exp)
            {
                throw new Exception("ERROR - "   exp.Message.ToString(), exp);
            }
        }
        return true;
  

С уважением,
Георадар.

Комментарии:

1. Почему db.SaveChanges(); это выходит за рамки транзакции?

2. почему вы публикуете код с закомментированными строками в нем?

3. Эй, Митч, прошу прощения, я дергал себя за волосы, пытаясь зафиксировать изменения, которые я перепробовал кучу вещей. Просто забыл удалить комментарии перед публикацией этого пользовательского интерфейса

4. @Alex, я следовал примеру определения области видимости транзакции ( msdn.microsoft.com/en-us/library/bb738523.aspx ). Их вызов метода SaveChanges находится за пределами области транзакции.

Ответ №1:

Вы используете файл локальной базы данных? Возможно, вы ищете изменения не в том месте. По умолчанию при запуске программы VS копирует файл базы данных в папку debug или release. Затем программа запускается, и изменения вносятся и сохраняются в файл в папке debug или release. Программа завершается, и когда вы смотрите на базу данных в вашей исходной папке, она выглядит так же. Вы можете изменить строку подключения в app.config, чтобы использовать абсолютный путь, чтобы избежать этого.

Смотрите http://blogs.msdn.com/b/smartclientdata/archive/2005/08/26/456886.aspx для получения дополнительной информации

Ответ №2:

TransactionScope бесполезен, если вы не вставляете в него вызов SaveChanges. Либо переместите в нее вызов SaveChanges, либо полностью удалите TransactionScope.

Комментарии:

1. Я следовал примеру определения области транзакции (msdn.microsoft.com/en-us/library/bb738523.aspx ). Их вызов метода SaveChanges находится за пределами области транзакции.

2. Я пытался переместить вызов SaveChanges в область транзакции, но все еще безуспешно