8

EF を使用してデータベース テーブルを更新しています。

接続モードでの単純なシナリオです。

更新したい行を取得します

var order = from o in Orders
        where o.ID = 1
        select o;

次に、レコードを次のように更新します。

order.FirstName = "First";
order.LastName = "Last";
context.SaveChanges();

それは正常に動作します。EF は、フィールドが変更されたかどうかを確認し、新しい値の場合にのみフィールドを更新します。SQL サーバーで CDC を有効にして、値が変更されていない場合に EF がデータベースに書き換えないことを確認しました。

ここで、このチェックをコードに追加してロジックを追加したいと考えています。つまり、レコードが更新されたときと更新されなかったとき (値が変更されていないため) を EF に通知させたいと考えています。誰か方法があれば教えてください。

比較するフィールドがたくさんあるので、各フィールドを手動でチェックしたくありません。

ありがとう

4

2 に答える 2

7

誰かが興味を持っているなら、これが私がしたことです。変更を保存する前に、フィールドが変更されているかどうかを確認するために、次のメソッドを作成しました。

private Dictionary<Type, bool> IsEntityModified()
{
    Dictionary<Type, bool> entity = new Dictionary<Type, bool>();
    var items = _bentities.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
    foreach (ObjectStateEntry entry in items)
    {
        foreach (string propName in entry.GetModifiedProperties())
        {
            string oldsetterValue, newsetterValue = null;
            // Get orginal value 
            oldsetterValue = entry.OriginalValues[propName].ToString();
            // Get new value 
            newsetterValue = entry.CurrentValues[propName].ToString();

            if (oldsetterValue != newsetterValue)
            {
                entity.Add(entry.Entity.GetType(), true);
            }
        }
    }
    return entity;
}
于 2012-07-17T09:56:47.440 に答える