LINQ to SQL でレコードを更新しようとしていますが、場合によっては値が元の値と同じで、Enitty フレームワークも不要な更新クエリを作成します。
var objForupdate = context.temp.FirstOrDefault();
if(objForupdate != null)
{
objForupdate.Name = "VJ"; // Original Value also "VJ"
}
// Create update query for above.
context.SaveChanges();
更新された Hey Steven Wood
ここに、DB に 20 個のフィールドがあるシナリオがあります。一部のデータが元のデータと同じ場合、Entity フレームワークもその更新クエリを作成します。
データ行がダーティ状態でない場合は簡単で、更新する必要はありません。ただし、エンティティ フレームワークは、そのための Update クエリも作成します。プロファイル ツールを使用して、SaveChanges() メソッドの実行後に DB サーバーで実行されたクエリの種類を確認するだけです。
ソリューション
次の関数を使用して、エンティティ オブジェクトが変更されたかどうかを確認します。そうでない場合は、EntityState.Modified から EntityState.Unchanged に変更します。
public static bool ChangeStateIfNotModified(this EntityObject entity, ObjectContext context)
{
if (entity.EntityState == EntityState.Modified)
{
ObjectStateEntry state = ontext.ObjectStateManager.GetObjectStateEntry(entity);
DbDataRecord orig = state.OriginalValues;
CurrentValueRecord curr = state.CurrentValues;
bool changed = false;
for (int i = 0; i < orig.FieldCount; ++i)
{
object origValue = orig.GetValue(i);
object curValue = curr.GetValue(i);
if (!origValue.Equals(curValue) && (!(origValue is byte[]) || !((byte[])origValue).SequenceEqual((byte[])curValue)))
{
changed = true;
break;
}
}
if (!changed)
{
state.ChangeState(EntityState.Unchanged);
}
return !changed;
}
return false;
}