使用Entity Framework Core 1.0更新記錄而無需Update / UpdateRange

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

熱門答案

實體框架可以處於EntityState枚舉定義的五種狀態之一。這些州是:

補充:實體正在被上下文跟踪但數據庫中尚不存在未更改:實體正在被上下文跟踪並存在於數據庫中,其屬性值未從數據庫中的值更改修改:實體正在被上下文跟踪並存在於數據庫中,並且其部分或全部屬性值已被修改已刪除:實體正在被上下文跟踪並存在於數據庫中,但已被標記為從數據庫中刪除下次SaveChanges被稱為Detached:上下文沒有跟踪實體

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



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow