2015-04-22 157 views
0

我已閱讀了與此類似的多個問題,但沒有一個是我的情況。Linq-To-Sql SubmitChanges不更新數據庫

使用LINQ到SQL我插入一個新的記錄,並提交更改。然後,在同一個Web請求中,我提取相同的記錄並更新它,然後提交更改。更改不會保存。這兩個操作的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代碼,因此實體應該得到改變的「通知」對這一領域:

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實例是相同的是不正確的。

所以,在我與辛格爾頓一生類,我得到的數據庫存儲庫的一個新的實例,並進行更新並沒有什麼問題。

現在我仍然不知道爲什麼原來的代碼沒有工作,我的方法仍然可以被認爲是更比一個解決方案的解決方法,但它沒有解決我的問題,希望能對別人有用。