Я смотрю некоторые учебные программы о ядре asp.net
В некоторых уроках преподаватели используют этот код для обновления данных в базе данных.
DataContext db = new DataContext();
var query = db.TblUsers.where(x => x.Id == 3).single();
query.Name = "Sami";
db.TblUsers.Attach(query);
db.Entry(query).state = EntityState.Modified;
db.SaveChanges();
Но некоторые преподаватели используют этот код для обновления данных в базе данных
DataContext db = new DataContext();
var query = db.TblUsers.where(x => x.Id == 3).single();
query.Name = "Sami";
db.Update(query);
db.SaveChanges();
На самом деле я не понимаю, какой из них использовать? Потому что оба кода работают.
Скажите, пожалуйста, что именно отличается между этими кодами?
Для вашего текущего кода нет необходимости использовать Attach
для первого способа. Если вы хотите обновить модель, извлекая записи из базы данных, воспользуйтесь вторым способом, что очень удобно.
Для Attach
он переведет сущность в график в состояние «Не db.Entry(query).state = EntityState.Modified
и установит сущность как Modified
помощью db.Entry(query).state = EntityState.Modified
, затем изменения в query
будут сохранены в базе данных. Поскольку db.TblUsers.where(x => x.Id == 3).single()
уже отслеживает query
, использовать Attach
не нужно.
Существует два типа запросов: tracking
и no-tracking
. Если вы не specificy запроса , как no-tracking
expecitly как db.TblUsers.AsNoTracking().where(x => x.Id == 3).single()
, объект будет трекинг , который Unchanged
состояние.
Для db.Update(query);
он начнет отслеживать заданную сущность в состоянии EntityState.Modified
, так что она будет обновлена в базе данных при вызове Microsoft.EntityFrameworkCore.DbContext.SaveChanges.