【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();
原文地址:https://www.cnblogs.com/yanglang/p/7884704.html