Как определить, являются ли какие-либо объекты в контексте грязными с .Net Entity Framework 4.0 - PullRequest
21 голосов
/ 26 апреля 2010

Я хочу быть в состоянии определить, есть ли какие-либо несохраненные данные в контексте структуры объекта. Я выяснил, как использовать ObjectStateManager для проверки состояний существующих объектов, но у меня есть две проблемы с этим.

  1. Я бы предпочел, чтобы одна функция вызывалась, чтобы увидеть, сохраняются ли какие-либо объекты, а не зацикливаться на всех объектах в контексте.
  2. Я не могу понять, как обнаружить добавленные объекты. Это подсказывает мне, что я не до конца понимаю, как работает контекст сущности. Например, если у меня есть ObjectSet myContext.Employees, и я добавляю нового сотрудника в этот набор (с .AddObject), я не вижу новую сущность, когда смотрю на ObjectSet, и также не вижу .Count увеличение. Однако, когда я делаю context.SaveChanges (), моя новая сущность сохраняется ... да?

Мне не удалось найти ответ на этот вопрос в моих поисках по msdn, поэтому я надеялся, что кто-то здесь сможет подсказать мне.

Заранее спасибо.

Ответы [ 4 ]

15 голосов
/ 26 апреля 2010
var addedStateEntries = Context
    .ObjectStateManager
    .GetObjectStateEntries(EntityState.Added);
8 голосов
/ 05 июля 2012

С помощью метода расширения (для каждого 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();
    }
}
6 голосов
/ 26 апреля 2010

Простой способ получить повторно используемый метод / свойство, вы можете добавить новый метод в свой 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;
    }
  }
}

В зависимости от того, что вы ищете, вы можете открыть другие свойства, чтобы узнать, есть ли просто удаления или модификации. Этот метод можно упростить, но я хотел, чтобы было ясно, что вам нужно будет сделать.

3 голосов
/ 26 апреля 2010

В этой статье описывается, что именно необходимо для отслеживания изменений в Entity Framework:

Разрешение идентификации, Управление состоянием и Отслеживание изменений (Entity Framework) - MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...