使用实体框架核心1.0更新记录而不需要Update/UpdateRange
本文关键字:新记录 不需要 Update UpdateRange 更新 实体 框架 核心 | 更新日期: 2023-09-27 18:03:51
在Entity Framework Core 1.0中,当我这样做时:
var products = _context.Products.ToList();
foreach (var prod in products)
{
prod.Status = 1;
}
_context.SaveChanges();
我相信它会自动更新列表中的所有产品,使其Status为1。
如果是这种情况下发生了什么,AddRange, UpdateRange,添加,更新,删除,等等?我还需要用这些吗?我觉得我不需要更新函数,因为一旦我从数据库中拉出实体,就会跟踪它们。
谁能帮我澄清一下吗?我的代码到处都是。在大多数情况下,我使用UpdateRange和Update函数,但最近才注意到,我可能只需要调用_context.SaveChanges()。现在如果我这样做:
var products = _context.Products.AsNoTracking().ToList();
foreach (var prod in products)
{
prod.Status = 1;
}
// I believe I would have to UpdateRange here...
_context.UpdateRange(products);
_context.SaveChanges();
实体框架可以处于由EntityState枚举定义的五种状态之一。这些状态是:
添加:实体正在被上下文跟踪,但还不存在于数据库中未改变:实体被上下文跟踪并且存在于数据库中,其属性值与数据库中的值没有变化已修改:实体正在被上下文跟踪,并且存在于数据库中,并且其部分或全部属性值已被修改已删除:实体正在被上下文跟踪并且存在于数据库中,但是在下次调用SaveChanges时已被标记为从数据库中删除Detached:实体没有被上下文跟踪
SaveChanges对处于不同状态的实体做不同的事情:
未更改的实体不会被SaveChanges触及。处于Unchanged状态的实体不会向数据库发送更新。添加的实体被插入到数据库中,然后在SaveChanges返回时变为Unchanged。修改后的实体在数据库中更新,然后在SaveChanges返回时变为Unchanged。删除的实体从数据库中删除,然后从上下文中分离。
当您将状态更改为Modified时,实体的所有属性将被标记为Modified,并且当SaveChanges被调用时,所有属性值将被发送到数据库。
DbSet. adrange,DbSet. adrange的一些例子。RemoveRange,你可以使用:DbSet。AddRange将实体集合(IEnumerable)添加到DbContext中,因此您不必单独添加每个实体。例如:
IList<Student> newStudents = new List<Student>();
newStudents.Add(new Student() { StudentName = "Student1 by addrange" });
newStudents.Add(new Student() { StudentName = "Student2 by addrange" });
newStudents.Add(new Student() { StudentName = "Student3 by addrange" });
using (var context = new SchoolDBEntities())
{
context.Students.AddRange(newStudents);
context.SaveChanges();
}
DbSet。RemoveRange用于删除实体集合:
List<Student> existingStudents = …..
using (var context = new SchoolDBEntities())
{
context.Students.RemoveRange(existingStudents);
context.SaveChanges();
}
注意:AddRange()在12范围内性能更好