在我执行类似以下操作时,在Entity Framework Core 1.0中
var products = _context.Products.ToList();
foreach (var prod in products)
{
prod.Status = 1;
}
_context.SaveChanges();
我相信它会自动更新列表中的所有产品,状态为1。
如果是这种情况,AddRange,UpdateRange,Add,Update,Remove等发生了什么......?我甚至需要再使用它们了吗?我觉得我不需要更新功能,因为只要我从数据库中提取实体就会跟踪实体。
有人可以帮我解决这个问题吗?我的代码到处都是。在大多数情况下,我使用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();
答案 0 :(得分:2)
实体框架可以处于EntityState枚举定义的五种状态之一。这些州是:
补充:实体正在被上下文跟踪,但数据库中尚不存在 未更改:实体正在被上下文跟踪并存在于数据库中,并且其属性值未从数据库中的值更改 已修改:实体正由上下文跟踪并存在于数据库中,并且已修改其部分或全部属性值 已删除:实体正在被上下文跟踪并存在于数据库中,但在下次调用SaveChanges时已标记为从数据库中删除 已分离:上下文未跟踪实体
SaveChanges为不同状态的实体做了不同的事情:
SaveChanges未触及未更改的实体。对于处于Unchanged状态的实体,不会向数据库发送更新。 添加的实体将插入到数据库中,然后在SaveChanges返回时变为Unchanged。 修改后的实体在数据库中更新,然后在SaveChanges返回时变为Unchanged。 已删除的实体将从数据库中删除,然后从上下文中分离。
当您将状态更改为Modified时,实体的所有属性都将标记为已修改,并且在调用SaveChanges时,所有属性值都将发送到数据库。
DbSet.AddRange,DbSet.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();
}
注意:在12范围内,AddRange()性能更好