美文网首页
解决EF批量操作,Z.EntityFramework.Exten

解决EF批量操作,Z.EntityFramework.Exten

作者: Asa_Guo | 来源:发表于2017-04-19 09:42 被阅读0次

    方案一:

    使用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()
    

    源代码:

                       // 方法一(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();
    

    相关文章

      网友评论

          本文标题:解决EF批量操作,Z.EntityFramework.Exten

          本文链接:https://www.haomeiwen.com/subject/nzlwuttx.html