37

データベース コンテキスト (DbContext) に変更が加えられたかどうかを判断する方法を見つけようとしています。注: Windows 7 の 64 ビット ボックスで、Visual Studio 2012 と Entity Framework 5 を使用しています。

DbContext の代わりに ObjectContext を使用していたときは、次のようなことができました。

public partial class MyObjectContext
{
    public Boolean HasUnsavedChanges()
    {
        return (this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted).Any());
    }
}

DbContextを使用しているので、これをやろうとしました:

public partial class MyDbContext
{
    public ObjectContext ObjectContext()
    {
        return (this as IObjectContextAdapter).ObjectContext;
    }

    public Boolean HasUnsavedChanges()
    {
        return (this.ObjectContext().ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted).Any());
    }
}

私が抱えている問題は、コンテキストが変更されたという事実を知っていても、メソッド「HasUnsavedChanges()」が常に「false」を返すことです。私が間違っていることについて誰かが何か考えを持っていますか?

4

2 に答える 2

48

EF 5DbContextの場合ChangeTracker:

 public bool HasUnsavedChanges()
 {
    return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
                                              || e.State == EntityState.Modified
                                              || e.State == EntityState.Deleted);
 }

EF 6 では、ChangeTracker.HasChanges()多対多の関係の変更も検出するメソッドを使用します。

 public bool HasUnsavedChanges()
 {
    return this.ChangeTracker.HasChanges();
 }
于 2012-08-17T20:25:31.640 に答える
35

Entity Framework 5を使用しているため、この回答は役に立ちませんが、他の人には役立つかもしれません。

Entity Framework 6以降およびEntity Framework Coreでは、コード行に従うだけで変更を確認できます。

context.ChangeTracker.HasChanges()
于 2016-12-22T17:15:37.013 に答える