#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 в область транзакции, но все еще безуспешно