【EF】解決EF批量操作,Z.EntityFramework.Extensions 過期方案


方案一:

使用EntityFramework.Extended
優點:

  1. 啟下載量是Z.EntityFramework.Extensions的10倍+
  2. 不會過期
    缺點:
    不能批量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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM