我正在看一些關於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
作為第一種方式。如果你想通過從數據庫中恢復記錄來更新Model,請使用方便的第二種方式。
對於Attach
,就會把實體在圖中為不變的狀態,並設置實體Modified
由db.Entry(query).state = EntityState.Modified
,則在改變query
將被保存到數據庫中。由於db.TblUsers.where(x => x.Id == 3).single()
已經在跟踪query
,因此無需使用Attach
。
查詢, tracking
和no-tracking
有兩種類型。如果您沒有將查詢特定為no-tracking
例如db.TblUsers.AsNoTracking().where(x => x.Id == 3).single()
,則實體將跟踪哪個是Unchanged
狀態。
對於db.Update(query);
,它將開始跟踪EntityState.Modified
狀態中的給定實體, EntityState.Modified
在調用Microsoft.EntityFrameworkCore.DbContext.SaveChanges時在數據庫中更新它。