web-dev-qa-db-ja.com

保存する保留中の変更があるかどうかを確認します

Entity Frameworkで、エンティティコンテキストに未保存の変更があるかどうかを確認する方法はありますか?

68
Palantir

これは機能する可能性があります(変更によってエンティティの追加、削除、変更を行う場合)

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
                    ) > 0;

編集:

改善されたコード:

bool changesMade = context.
                   ObjectStateManager.
                   GetObjectStateEntries(EntityState.Added | 
                                         EntityState.Deleted | 
                                         EntityState.Modified
                                        ).Any();
57
Yakimych

EF 6以降、context.ChangeTracker.HasChanges()があります。

84
Thaoden

EF 4+を使用しているユーザー向けに、拡張メソッドと同等のソリューションを次に示します。

_public static class DbContextExtensions {
    public static Boolean HasPendingChanges(this DbContext context) {
        return context.ChangeTracker.Entries()
                      .Any(e => e.State == EntityState.Added
                             || e.State == EntityState.Deleted
                             || e.State == EntityState.Modified);
    }
}
_

ビットマスクとして値を結合できないことに注意してください。関数GetObjectStateEntries()がロジックを処理しましたが、LINQは適切な結果を生成しません。

42
Yuck