0

私はAPIを構築するためにASP.NET Coreを使用しており、データアクセスのために私はEF Coreを使用しています。 StackoverflowとGoogleの周りをサーフィンすると、変更された列だけをリポジトリパターンで更新する方法が見つかりません。Entity Frameworkコアで変更された列を更新するには?

値が変更されているかどうかを確認する手段はありますか?

public virtual void Update(T entity) 
{ 
     // DbContext.Attach(entity); 
     var dbEntityEntry = DbContext.Entry(entity); 

     foreach (var property in dbEntityEntry.Properties) 
     { 
      var original = dbEntityEntry.OriginalValues.GetValue<object>(property.Metadata.Name); 
      var current = dbEntityEntry.CurrentValues.GetValue<object>(property.Metadata.Name); 

      if (original != null && !original.Equals(current)) 
       dbEntityEntry.Property(property.Metadata.Name).IsModified = true; 
     } 
} 

私はEF 6のように実装しようとしたが、それはInvalidCastExceptionがに

System.InvalidCastExceptionの投げている:「タイプ System.Func'2 [Microsoft.EntityFrameworkCore.ChangeTrackingのオブジェクトをキャストすることができませんが。 Internal.InternalEntityEntry、System.Int32] 'を入力して' System.Func`2 [Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry、System.Object]と入力します。

私はクライアントから受け取ったオブジェクトをアクションコントローラに直接更新して更新しています。

本当にありがとうございます。であなたの通過が元々EF自体は文句を言わないのプロパティが変更されたりしていないものを追跡することができるので、エンティティは、追跡することが文句を言わない、その後dbContextから取得されていないことを

おかげ

+0

なぜあなたは自分で行う必要があるでしょうあなたは思いますか?プロファイラでUPDATEクエリを取得し、すべてのフィールドが変更されていない場合でもSET句に存在することを確認しましたか? – CodeCaster

+0

はい私はSql Express Profilerでチェックしました。オブジェクト全体を送信するときに、値が変更されていなくてもUPDATE文で設定されています。 jsonオブジェクトでプロパティを送信しないと、ValidationEntityResultがスローされます。 –

+0

誰もこの問題に直面しましたか? –

答えて

0

オリジナルTエンティティの場合。

また、dbContext.Updateを呼び出すと、エンティティのすべてのプロパティがダーティーとしてマークされます。

DBContextから最初にエンティティをフェッチし、次にautomapperのようなものを使用して、渡されたエンティティのプロパティを検索したモデルにマップし、次にDbContext.SaveChanges()を呼び出すと、プロパティのみが更新されますマップ中に変更されたAutomapperは両側に存在するマッピングプロパティのみを処理します。細かい制御が必要な場合は、マッピングを構成できます。以下

擬コード:

public virtual void Update(T entity) 
{ 
     var existingEntity = DbContext.Entity.First(x => x.Id == entity.Id); 
     autoMapper.Map(entity, existingEntity); 
     DbContext.SaveChanges(); 
} 
関連する問題