【问题标题】:Updating records with Entity Framework Core 1.0 without needing to Update/UpdateRange使用 Entity Framework Core 1.0 更新记录,无需 Update/UpdateRange
【发布时间】:2016-08-24 22:35:35
【问题描述】:

在 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();

【问题讨论】:

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


    【解决方案1】:

    实体框架可以处于 EntityState 枚举定义的五种状态之一。这些状态是:

    添加:实体正在被上下文跟踪,但在数据库中尚不存在 Unchanged:实体正在被上下文跟踪并存在于数据库中,其属性值与数据库中的值没有变化 已修改:实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被修改 已删除:实体正在被上下文跟踪并存在于数据库中,但已被标记为在下次调用 SaveChanges 时从数据库中删除 已分离:上下文未跟踪实体

    SaveChanges 对不同状态的实体做不同的事情:

    SaveChanges 不会触及未更改的实体。对于处于未更改状态的实体,更新不会发送到数据库。 添加的实体被插入到数据库中,然后在 SaveChanges 返回时变为 Unchanged。 修改后的实体在数据库中更新,然后在 SaveChanges 返回时变为未更改。 已删除的实体将从数据库中删除,然后从上下文中分离。

    当您将状态更改为已修改时,实体的所有属性都将被标记为已修改,并且所有属性值将在调用 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();
    }
    

    注意:AddRange() 性能在 12 范围内更好

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2020-12-06
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多