有一些在性能要求比较高的地方,或者有一些场景下数据的更改不需要先获取数据,我们可以通过使用 Attach的方式来让DBContext跟踪我们实体的变更。这样当我们调用SaveChagnes的时候它就会生适当的sql
如下面的例子假设我们的Student有一大堆的属性。而这个时候我们只想改它的Age。比如年龄加1。 我们也不需要获取其它的属性数据。 我们就可以用下面的代码了。
//获取DBCotnext
var malemaDbContext = sp.GetService<MalemaDbContext>();
var partialModel = malemaDbContext.Students.Select(x => new
{
x.Id,
x.Age
}).FirstOrDefault(x => x.Id == 1);
var partialUpdated = new Student()
{
Age = partialModel.Age,
Id = partialModel.Id //Id这个是主键。必须得有主键,
};
malemaDbContext.Attach(partialUpdated); // attach之后就会进行跟踪了。
partialUpdated.Age = partialModel.Age+1; //这边进行更改。
// 如果想把属性Name 改成Empty。跟原来的值一样是没效的。 必须跟Attach之前的值不一样才会有效果。
malemaDbContext.SaveChanges();
生成的sql如下
udpate stduent set Age = 50 where id=1