方案一:
使用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();