• 【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();
  • 相关阅读:
    Uri编码,包括javascript前端与C#服务器端
    HttpWebResponse类
    HTTP报文
    HTTP权威指南阅读记录
    XMPP通讯开发-1
    开源安卓播放器:Dolphin Player 简单分析
    Spring MVC框架
    Median of Two Sorted Arrays (找两个序列的中位数,O(log (m+n))限制) 【面试算法leetcode】
    C语言指针5分钟教程
    2013中国互联网安全大会---关于季昕华老师的分享(不喜请勿入!)
  • 原文地址:https://www.cnblogs.com/yanglang/p/7884704.html
Copyright © 2020-2023  润新知