DbContext 更新与 EntityState 修改

777*_*777 5 c# http-put dbcontext entity-framework-core asp.net-core

_context.Entry(entity).State = EntityState.ModifiedASP.NET EF Core和之间有什么区别_context.Entity.Update(entity)?例如:

[HttpPut]
public async Task<ActionResult<Student>> PutStudent(Student student)
{
     **_context.Entry(student).State = EntityState.Modified;**
     await _context.SaveChangesAsync();
     return student;
}
Run Code Online (Sandbox Code Playgroud)
    
[HttpPut]
public async Task<ActionResult<Student>> PutStudent(Student student)
{
     **_context.Student.Update(student);**
     await _context.SaveChangesAsync();
     return student;
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*old 9

将实体的状态设置为Modified会将实体的所有标量属性标记为已修改,这意味着SaveChanges将生成更新语句来更新除关键字段之外的所有映射表字段。

没有询问,但单个属性也可以标记为Modified

_context.Entry(student).Property(s => s.Name).IsModified = true;
Run Code Online (Sandbox Code Playgroud)

这还将实体的状态设置为已修改。

方法Update完全不同,请参阅文档

开始跟踪给定实体 (...)
对于具有生成键的实体类型,如果实体设置了主键值,那么它将在“已修改”状态下进行跟踪。如果未设置主键值,则会在“已添加”状态下进行跟踪。这有助于确保插入新实体,同时更新现有实体。如果主键属性设置为属性类型的 CLR 默认值以外的任何值,则实体被视为已设置其主键值。

这在新的和更新的实体附加到上下文的断开连接的场景中非常方便。EF 将找出哪些实体是Added,哪些是Modified

另一个区别是该Update方法还遍历嵌套实体。例如,如果Exams是类中的一个集合Student,则更新 aStudent也会将其标记ExamsModified,或者Added未设置其键的位置。

没有记录,但值得一提的是,如果 aStudent及其Exams附加为Unchanged那么该Update方法只会将Student的状态设置为Modified,而不是Exams