我正在看一些有关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();
事实上,我混淆了使用其中的哪个?因为两个代码都起作用。
请告诉我这些代码之间到底有什么不同?
答案 0 :(得分:0)
对于您当前的代码,第一种方法无需使用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
状态的给定实体,以便在调用Microsoft.EntityFrameworkCore.DbContext.SaveChanges时在数据库中对其进行更新。