2017-07-09 3 views
-1

Entity Framework 6を​​使用しています.EFを使用してデータベースの列を更新すると、レコードは問題なく更新されますが、更新クエリを使用してSQL Serverの列の値を変更した後、EFは列の値を更新せず、例外もスローしません。私はT-SQL DbContext.ChangeTracker.HasChangesを使用して、データベース内の値を変更した場合、通常でSQL Serverの列の値を変更した後、Entity Frameworkが列を更新しない

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 
} 

アプリケーションのアップデートの実行には、(OKですが)私は新しいコンテキストを作成し、DBからレコードを取得する場合はfalseを返しますが、それを変更するDbContext .ChangeTracker.HasChanges()はtrueを返します アイデア?

+1

私たちとあなたのコードを共有してください。 –

+1

私が間違っている場合は、EFを使用して更新ステートメントを使用すると正しく動作します。また、TSQL更新ステートメントを使用すると、正しく動作しません。 – Valkyrie

+0

TSQLのレコードをどのように更新しようとしていますか?コードのどこかにブレークポイントを使用しているのですか? – MKR

答えて

0

おそらく、あなたは同時アクセスの状況をシミュレートしようとしています。 yesの場合は、[今すぐライン

if (customerMandate != null) 

にブレークポイントを入れてください、データベース内の値を変更し、ブレークポイントから前方に移動します。あなたはSaveChangesAsyncコールで例外を期待します。

もう1つは、管理スタジオでTSQLを使用してテーブル内のstateを変更したことを確認できます。次回プログラムを実行するときに新しい状態がcustomerMandateであった場合は非常にです。

DbContextは、共有コードの1行目で使用する前に定義され、使用されていません。別の更新クエリを開始する前に、そのDbContextに保留中の保留中のアイテム/アクションが完了していることを確認してください。そうでなければ、それらは失敗を引き起こす可能性があります。

+0

あなたの答えに感謝します。私は自分のコードを編集して、よりよく説明してくれますか? –

+0

「働く」と「働かない」とはどういう意味ですか?あなたはTSQL(SSMS経由)を使用してDB内で値が変更されても 'DbUpdateConcurrencyException'が得られない場合、またはデータベースが更新されていないことを意味しますか?私はこれの答えは疑問を明らかにすると思います。 – MKR

+0

データベースに文が送信されない場合、DbUpdateConcurrencyExceptionは発生しません。また、EntityStateが変更され、そのタプルが実際に存在する場合(これは、SaveChanges()の前に削除されていなければならない)必要があります。私はあなたがその仮定をどこから得るのかはよく分かりません。 – DevilSuichiro

関連する問題