我正在看一些关于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时在数据库中更新它。