使用Entity Framework Core 1.0更新记录而无需Update / UpdateRange

时间:2016-08-24 14:03:28

标签: c# entity-framework entity-framework-core

在我执行类似以下操作时,在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();

1 个答案:

答案 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()性能更好