DbContext.Entry() против DbConext. Attach ( ).Attach() для нового или еще не отслеживаемого объекта

#entity-framework #asp.net-core #entity-framework-core

#entity-framework #asp.net-core #entity-framework-core

Вопрос:

Я использую VS 2019 с ASP.NET Core 3.1 и EF Core 3.1, и заметил, что коды по умолчанию для базовой операции редактирования являются:

  public async Task<IActionResult> OnPostAsync()
{
   //...
  _context.Attach(entity).State = EntityState.Modified;
   //...
}
  

Из руководств EF я также узнал:

_context.Entry(entity).State = EntityState.Modified;

Просматривая документацию, я понял, что DbContext.Attach по умолчанию устанавливает Unchanged состояние. Но будет ли установка состояния на EntityState.Modified сразу после, как показано в коде VS scaffolded, эквивалентна установке его через DbContext.Entry().State ?

Затем я подумал, DbContext.Attach использовался ли, потому что объект еще не отслеживался. Но документация MS говорит об этом DbContext.Entry() методе:

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

Так что это меня немного смутило. Поскольку оба .Entry() и .Attach() (без настройки.Состояние еще) возвращает EntityEntry<TEntity> , в чем разница между этими двумя методами до установки свойства .State? Могут ли они использоваться взаимозаменяемо в приведенном выше сценарии?

Комментарии:

1. Я думаю, что их самое большое отличие — это состояние, attach изменит состояние на неизменное, при вводе состояние отключено.