ObjectSet.ApplyCurrentValues ​​v / s StateManager.ChangeObjectState - PullRequest
1 голос
/ 18 мая 2011

Я новичок в Entity Framework 4.1. Я начинаю писать новое приложение, используя EF в качестве моего DAL. Я использую классы POCO (используя шаблон POCO t4) с первым подходом к базе данных.

Мой GenericRepository получил ниже Метод обновления

public void Update(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException("entity");
    }

    _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    //_objectSet.ApplyCurrentValues(entity);
}

У меня есть gridview, который привязывается к объекту ObjectDataSource с UpdateMethod = "UpdateStore", который принимает только один параметр, следующим образом ...

public void UpdateStore(Store franchise)
{
    unitOfWork.StoreRepository.Attach(franchise);
    unitOfWork.StoreRepository.Update(franchise);
    unitOfWork.SaveChanges();
}

У меня есть пара вопросов здесь:

  1. Когда я вижу документацию для ApplyCurrentValues ​​, это доказывает, что я должен использовать это для обновления значений, но это не работает (как вы можете видеть в приведенной выше строке с комментариями). Затем, когда я пытаюсь с ObjectStateManager.ChangeObjectState, это работает. В чем разница между этими двумя подходами.

  2. Как видите, я сначала присоединяюсь, а затем применяю метод обновления. Могу ли я объединить состояние присоединения и обновления в моем методе обновления GenericRepository. Есть ли какие-либо подводные камни в этом?

1 Ответ

3 голосов
/ 18 мая 2011
  1. ApplyCurrentChanges используется, когда вы прикрепили объект, загруженный из базы данных, и хотите обновить его значения от отсоединенного объекта, полученного от вашего ObjectDataSource.Когда вы делаете это, все новые значения копируются в присоединенную сущность, и она автоматически помечается как Modified.ChangeObjectState используется для изменения состояния присоединенного объекта - больше ничего не делает.Вызов Attach присоединяет сущность в состоянии Unchanged, поэтому вы должны изменить состояние, чтобы сохранить ваши изменения в базе данных.
  2. Да, вы можете объединить состояние присоединения и установки в одном методе,Просто нужно убедиться, что вы будете вызывать этот метод только один раз для каждой сущности.Присоединение объекта с одинаковым Id дважды вызовет исключение.
...