方案一:
使用EntityFramework.Extended
優點:
- 啟下載量是Z.EntityFramework.Extensions的10倍+
- 不會過期
缺點:
不能批量Insert
方案二:解決批量Insert(update不可用,update必須是true)
///在批量插入時,需要加上dbContext.Configuration.AutoDetectChangesEnabled = false; ///解釋:http://www.cnblogs.com/linfei721/archive/2013/06/07/3123579.html
方案二解釋:
http://www.cnblogs.com/hehexiaoxia/p/5707180.html
EF中對實體狀會有4種狀態: 1.Added: 對象為新對象,並且已添加到對象上下文,但尚未調用SaveChange之前都是Added(期間若修改對象屬性,對象狀態 任為Added, 刪除該對象時狀態變為Detached) 4.Modified: 當對象的屬性被修改時,如果 AutoDetectChangesEnabled=true,或者調用了DetectChanges(),那么該對象的狀態 會被修改為Modified 2.Deleted: 調用對象集合把對象A Remove后,EF標記該對象為准備從數據庫中刪除,調用SaveChanges()后數據庫刪除該記錄, 並且EF把該對象標記為Detached 3.Detached: 對象存在,但尚未被添加到上下文。 5.Unchanged: 當直接從數據庫加載到上下文,或者調用Attach附加一個對象時,該對象的狀態為Unchanged ValidateOnSaveEnabled:保存前驗證對象的屬性最大最小長度等,默認為true。 1.如果ValidateOnSaveEnabled=true,那么SaveChanges()前不會調用DetectChanges(), 反之如果ValidateOnSaveEnabled=false,那么只有在AutoDetectChangesEnabled=true的情況下, EF在SaveChanges()前才會調用DetectChanges() AutoDetectChangesEnabled:自動跟蹤對象的屬性變化,默認為true。 1.如果關閉EF自動跟蹤,在SaveChanges()前尚未手動調用DetectChanges(),那么保存不會生效。(前提:對象狀態為Unchanged) 因為如果AutoDetectChangesEnabled=false,那么EF就不會自動跟蹤對象屬性的變化,從而導致對象的狀態也不會變為Modified, 並且因為AutoDetectChangesEnabled=false,那么EF在SaveChanges() 實際保存到數據庫之前不會調用DetectChanges(), 所以最終修改不會生效。 2.如果AutoDetectChangesEnabled=true,那么就算不調用DetectChanges(),EF在SaveChanges()時也能生效。 DetectChanges():同步對象與其屬性的狀態。 1.如果對象A的狀態為Unchanged,A的屬性A1狀態為Modified,那么調用DetectChanges()后,A狀態變為Modified 2.如果AutoDetectChangesEnabled=true,那么對象與其屬性的狀態會立即同步 AcceptAllChanges():上下文能跟蹤狀態為Added、Modified、Deleted的所有對象,修改他們的狀態為Unchanged。在SaveChanges()失敗時不 會調用該方法。 AcceptAllChangesAfterSave:標志SaveChanges()后調用AcceptAllChanges 1.EF6.0在SaveChanges()成功后始終會調用AcceptAllChanges(),把Added、Modified、Deleted的對象狀態修改為Unchanged DetectChangesBeforeSave:標志在SaveChanges()前,需要調用DetectChanges()同步所有狀態 1.如果AutoDetectChangesEnabled=false,那么在SaveChanges()前,不會調用DetectChanges()同步所有狀態 SaveChanges(): 1.只有當AutoDetectChangesEnabled=true,ValidateOnSaveEnabled=false的情況下,在保存之前才會調用DetectChanges() 2.當保存成功后,始終都會調用AcceptAllChanges() 作者:Asa_Guo 鏈接:http://www.jianshu.com/p/cff2bb03ac1d 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
源代碼:
1 // 方法一(EF擴展Z.EntityFrameWork) 2 dbContext.Configuration.AutoDetectChangesEnabled = false;// 解決批量性能問題 3 List<EFModel.Machine> machines = new List<Machine>(); 4 for (int i = 0; i < bedNoList.Count; i++) 5 { 6 EFModel.Machine machine = CreateMachine(bedNoList[i], true); 7 machines.Add(machine); 8 } 9 dbContext.BulkInsert<EFModel.Machine>(machines); 10 dbContext.BulkSaveChanges(); 11 12 // 方法二(原生EF) 13 //dbContext.Configuration.AutoDetectChangesEnabled = false;// 解決批量性能問題 14 //dbContext.Configuration.ValidateOnSaveEnabled = false;// 解決“對一個或多個實體的驗證失敗。” 15 16 //List<EFModel.Machine> machines = new List<Machine>(); 17 //for (int i = 0; i < bedNoList.Count; i++) 18 //{ 19 // EFModel.Machine machine = CreateMachine(bedNoList[i], true); 20 // dbContext.Entry<EFModel.Machine>(machine).State = EntityState.Added; 21 //} 22 //dbContext.SaveChanges();