Подтвердить что ты не робот

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

var addedStateEntries = Context
    .ObjectStateManager
    .GetObjectStateEntries(EntityState.Added);

Ответ 2

Через метод расширения (для каждого объекта 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();
    }
}

Ответ 3

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

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