2017-07-09 36 views
-1

我正在使用實體框架6.當我使用EF更新數據庫的列時。記錄更新沒有任何問題,但在更改SQL Server中使用更新查詢的列的值後,EF不會更新列值,也不會引發任何異常。在更改SQL Server中列的值後,實體框架不更新列

CustomerMandate customerMandate = await DbContext.CustomerMandates.FirstOrDefaultAsync(mandate => mandate.Id == 1, cancellationToken); 
if (customerMandate != null) 
{ 
    customerMandate.State = newState; 
    await DbContext.SaveChangesAsync(cancellationToken);// not working 
} 

DbContext newContext = new DbContext(); 
CustomerMandate customerMandate1 = await newContext.CustomerMandates.FirstOrDefaultAsync(mandate => mandate.Id == 1, cancellationToken); 
if (customerMandate1 != null) 
{ 
    customerMandate1.State = newState; 
    await DbContext.SaveChangesAsync(cancellationToken);// working 
} 
在正常的應用程序更新的執行

是好的,但是當我使用T-SQL DbContext.ChangeTracker.HasChanges()返回false數據庫中更改值,但是當我創造新的上下文,並從數據庫獲取記錄,並改變它的DbContext .ChangeTracker.HasChanges()返回true 任何想法?

+1

請與我們分享您的密碼。 –

+1

糾正我,如果我錯了,當你使用更新語句使用EF它的工作原理,當你使用TSQL更新語句它不? – Valkyrie

+0

您如何嘗試更新TSQL中的記錄?我的意思是如果你在代碼中的某個地方使用斷點? – MKR

回答

0

可能您正試圖模擬併發訪問的情況。如果是的話,請把破發點線

if (customerMandate != null) 

現在,修改價值的數據庫,然後從突破點向前邁進。你會期望在SaveChangesAsync的呼叫例外。

另一個想法是在管理工作室中使用TSQL在表中修改state,然後當您下次運行程序時可以使用customerMandate

我們看不到DbContext是在共享代碼的第1行中使用它之前定義和使用的。我希望你已經確定在啓動另一個更新查詢之前,已經完成了在該DbContext上待處理的任何未決項目/操作。如果不是,那麼可能會導致失敗。

+0

感謝您的回答我編輯我的代碼以更好地解釋您是否請再次查看它? –

+0

「工作」和「不工作」是什麼意思?你的意思是,如果使用TSQL(通過SSMS)在數據庫中更改了值,仍然沒有得到'DbUpdateConcurrencyException'或者你的意思是數據庫沒有更新?我想這個答案會讓問題變得清晰。 – MKR

+0

如果沒有語句發送到數據庫,則不會發生DbUpdateConcurrencyException。另外,如果EntityState如果修改並且元組確實存在(它必須是除非在SaveChanges()之前被刪除)纔會發生。我不太清楚你從哪裏得到這個假設。 – DevilSuichiro

相關問題