方案一:
使用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()
源代码:
// 方法一(EF扩展Z.EntityFrameWork)
dbContext.Configuration.AutoDetectChangesEnabled = false;// 解决批量性能问题
List<EFModel.Machine> machines = new List<Machine>();
for (int i = 0; i < bedNoList.Count; i++)
{
EFModel.Machine machine = CreateMachine(bedNoList[i], true);
machines.Add(machine);
}
dbContext.BulkInsert<EFModel.Machine>(machines);
dbContext.BulkSaveChanges();
// 方法二(原生EF)
//dbContext.Configuration.AutoDetectChangesEnabled = false;// 解决批量性能问题
//dbContext.Configuration.ValidateOnSaveEnabled = false;// 解决“对一个或多个实体的验证失败。”
//List<EFModel.Machine> machines = new List<Machine>();
//for (int i = 0; i < bedNoList.Count; i++)
//{
// EFModel.Machine machine = CreateMachine(bedNoList[i], true);
// dbContext.Entry<EFModel.Machine>(machine).State = EntityState.Added;
//}
//dbContext.SaveChanges();