2016-08-24 147 views
1

在實體框架的核心1.0當我做這樣的事情:更新記錄,而無需更新/ UpdateRange

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

回答

2

實體框架可以在五分之一的國家由EntityState枚舉定義。這些狀態如下:

增加:實體正在被上下文跟蹤,但在數據庫中尚不存在 未更改:實體正在被上下文跟蹤並存在於數據庫中,且其屬性值未更改來自數據庫中的值 修改:實體正在被上下文跟蹤並存在於數據庫中,並且其某些或全部屬性值已被修改 已刪除:實體正在被上下文跟蹤並存在於數據庫中,但在下次調用SaveChanges時已標記爲從數據庫中刪除 獨立:實體未被上下文跟蹤

Sav eChanges爲不同狀態的實體做了不同的事情:

SaveChanges未觸及未更改的實體。更新不會發送到數據庫處於Unchanged狀態的實體。 添加的實體被插入到數據庫中,然後在SaveChanges返回時變爲Unchanged。 修改的實體在數據庫中更新,然後在SaveChanges返回時變爲未更改。 刪除的實體從數據庫中刪除,然後從上下文中分離。

當您將狀態更改爲修改時,實體的所有屬性將被標記爲已修改,並且在調用SaveChanges時將所有屬性值發送到數據庫。

爲DbSet.AddRange,DbSet.RemoveRange一些例子,你可以使用: DbSet.AddRange增加了實體的集合(IEnumerable的)到的DbContext,所以你不必添加的每個實體individually.for例如:

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範圍內更好