2015-04-22 4 views
0

Я читал несколько вопросов, подобных этому, но ни одна из них не является моей ситуацией.Linq-To-Sql SubmitChanges Не обновлять базу данных

Использование linq-to-sql Вставьте новую запись и отправьте изменения. Затем, в том же веб-запросе, я беру ту же самую запись и обновляю ее, а затем отправляю изменения. Изменения не сохраняются. DatabaseContext одинаковый для обеих этих операций.

Вставка:

var transaction = _factory.CreateTransaction(siteId, userId, questionId, type, amount, transactionId, processor); 

using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) 
{ 
    transaction.Amount = amount; 

    _transactionRepository.Add(transaction); 

    unitOfWork.Commit(); 
} 

Выбор и обновление:

ITransaction transaction = _transactionRepository.FindById(transactionId); 

if (transaction == null) throw new Exception(Constants.ErrorCannotFindTransactionWithId.FormatWith(transactionId)); 

using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) 
{ 
    transaction.CrmId = crmId; 

    transaction.UpdatedAt = SystemTime.Now(); 

    unitOfWork.Commit(); 
} 

Вот единица работы кода:

public virtual void Commit() 
{ 
    if (_isDisposed) 
    { 
     throw new ObjectDisposedException(GetType().Name); 
    } 

    _database.SubmitChanges(); 
} 

Я даже пошел в файл designer.cs и положить точка останова в поле, которое устанавливается, но не обновляется. Я прошел через и он вошел и выполнить set код, поэтому Entity следует получать «уведомление» изменения в этой области:

public string CrmId 
{ 
    get 
    { 
     return this._CrmId; 
    } 
    set 
    { 
     if ((this._CrmId != value)) 
     { 
      this.OnCrmIdChanging(value); 
      this.SendPropertyChanging(); 
      this._CrmId = value; 
      this.SendPropertyChanged("CrmId"); 
      this.OnCrmIdChanged(); 
     } 
    } 
} 

Другая полезная информация:

  • ObjectTracking включен
  • Нет ошибок или исключений при вызове второй SubmitChanges (просто молчал обновление)
  • Профилировщик SQL показывает вставку и выбирает, но не следующий оператор обновления. Linq-To-Sql не создает инструкцию обновления.
  • Существует только одна база данных, одна строка базы данных, поэтому обновление не собирается в другую базу данных.
  • Таблица имеет первичный ключ.

Я не знаю, что могло бы заставить Linq-To-Sql не выдавать команду обновления и не поднимать какую-либо ошибку. Возможно, проблема связана с использованием того же экземпляра DataContext? Я даже обновил объект из базы данных, используя метод DataContact.Refresh, прежде чем он будет извлечен для обновления, но это не помогло.

+1

Можете ли вы предоставить MCVE для этого? Без какого-либо кода он оставляет нам догадки о том, что может пойти не так. – Becuzz

+0

Вы должны уведомить вашу организацию о том, что содержимое было изменено. Я верю в ваше дело, что ваша сущность не знает об изменениях, поэтому игнорирует вашу команду. Пожалуйста, предоставьте код, который поможет вам, поскольку мы догадываемся, что происходит не так. –

+0

Спасибо. Код предоставлен. Я использую репозиторий и фабричные шаблоны, поэтому я не знаю, насколько это полезно. Джордж, как я могу уведомить мою сущность, которая изменилась? –

ответ

0

Я нашел то, что может быть основной причиной. Я использую Unity. Начальная вставка выполняется в классе обслуживания с временем жизни PerWebRequest. Выбор и обновление происходит в классе с продолжительностью жизни Singleton. Поэтому мое предположение о том, что экземпляры DataContext совпадают, было неправильным.

Итак, в моем классе с продолжительностью жизни Singleton я получаю свежий экземпляр репозитория базы данных и выполняю обновление и без проблем.

Теперь я до сих пор не знаю, почему исходный код не работал, и мой подход все же можно считать более обходным решением, чем решение, но оно решило мою проблему и, надеюсь, будет полезно другим.

Смежные вопросы