0

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;
}
4

2 に答える 2

1

2 つの値が同じ場合に更新を実行したくない場合は、次のようにしてください。

if(objForUpdate.Name != orignalValue){
      context.SaveChanges();
}

適切な場所でコンテキストを破棄してください。たとえば、これが MVC コントローラーにある場合、コントローラーのDispose()メソッドでコンテキストを破棄します。

于 2013-10-08T13:56:31.603 に答える