22

エンティティフレームワークのコンテキストに未保存のデータがあるかどうかを確認できるようにしたいと思います。ObjectStateManagerを使用して既存のエンティティの状態を確認する方法を理解しましたが、これには2つの問題があります。

  1. コンテキスト内のすべてのエンティティをループするのではなく、単一の関数を呼び出して、エンティティが保存されていないかどうかを確認することをお勧めします。
  2. 追加したエンティティを検出する方法がわかりません。これは、エンティティコンテキストがどのように機能するかを完全には理解していないことを私に示唆しています。たとえば、ObjectSet myContext.Employeesがあり、このセットに(.AddObjectを使用して)新しい従業員を追加した場合、ObjectSetを見ると新しいエンティティが表示されず、.Countも表示されません。増加。ただし、context.SaveChanges()を実行すると、新しいエンティティが保持されます...え?

私はmsdn検索でこれに対する答えを見つけることができなかったので、ここの誰かが私を手がかりにできることを望んでいました。

前もって感謝します。

4

4 に答える 4

15
var addedStateEntries = Context
    .ObjectStateManager
    .GetObjectStateEntries(EntityState.Added);
于 2010-04-26T17:14:56.273 に答える
9

拡張メソッド経由(すべてのObjectContextに対して):

internal static class ObjectContextExtensions
{
    public static bool IsContextDirty(this ObjectContext objectContext)
    {
        return objectContext
            .ObjectStateManager
            .GetObjectStateEntries(
                EntityState.Added | 
                EntityState.Deleted | 
                EntityState.Modified).Any();
    }
}

または部分的なメソッドを介して(ObjectContextの場合のみ):

partial class MyModel
{
    public bool IsContextDirty()
    {
        return ObjectStateManager
            .GetObjectStateEntries(
                EntityState.Added | 
                EntityState.Deleted |
                EntityState.Modified).Any();
    }
}
于 2012-07-05T14:16:22.520 に答える
6

再利用可能な単一のメソッド/プロパティを取得する簡単な方法は、部分クラスを作成し、次のようなプロパティを追加することで、ObjectContextに新しいメソッドを追加できます。

public partial class MyEntityContext
{
  public bool IsContextDirty
  {
    get
    {
      var items = ObjectStateManager.GetObjectStateEntries(EntityState.Added);
      if(items.Any())
        return true;
      items = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted);
      if (items.Any())
        return true;
      items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
      if(items.Any())
        return true;
      return false;
    }
  }
}

探しているものに応じて、他のプロパティを公開して、削除または変更だけがあるかどうかを知ることができます。この方法は単純化できますが、何をする必要があるかを明確にしたかったのです。

于 2010-04-26T17:33:05.230 に答える
3

この記事では、EntityFrameworkで変更の追跡を実行するために必要なものについて詳しく説明します。

ID解決、状態管理、および変更の追跡(Entity Framework)-MSDN

于 2010-04-26T16:01:36.230 に答える