分享

EF获取非跟踪数据之DBSet.AsNoTracking()

 ThinkTank_引擎 2017-09-04


1.目前EF版本是6.0,生成的数据库实体模型都是DbSet<T>类型

2.默认情况下对于数据的访问都是启用模型跟踪

  1. ctx.Configuration.AutoDetectChangesEnabled=true  

自动调用DbContext.ChangeTracker.DetectChanges的方法:

DbSet.Find
DbSet.Local
DbSet.Remove
DbSet.Add
DbSet.Attach
DbContext.SaveChanges
DbContext.GetValidationErrors
DbContex.Entry
DbChangeTracker.Entries

3.如果对于不需要修改的数据可以使用AsNoTracking()方法

  1. //  
  2. // 摘要:  
  3. //     表示针对 DbContext 的 LINQ to Entities 查询。  
  4. //  
  5. // 类型参数:  
  6. //   TResult:  
  7. //     要查询的实体的类型。  
  8. [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "Name is intentional")]  
  9. public class DbQuery<TResult> : IOrderedQueryable<TResult>, IQueryable<TResult>, IEnumerable<TResult>, IOrderedQueryable, IQueryable, IEnumerable, ......  
  10. {  
  11.     //  
  12.     // 摘要:  
  13.     //     返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。  
  14.     //  
  15.     // 返回结果:  
  16.     //     应用了 NoTracking 的新查询。  
  17.     public virtual DbQuery<TResult> AsNoTracking();  


4.特别说明:对于使用AsNoTracking()的数据不能用于修改。

  1. //AsNoTracking 获取到的数据不能用作修改  
  2. using (MenuModel _Context = new MenuModel())  
  3. {  
  4.     Menu.Menu first = _Context.Menus.AsNoTracking().First();  
  5.     Console.WriteLine(first.MenuName);  
  6.     first.MenuName = "abc";  
  7.     first.Model.ModelName = "123";  
  8.     _Context.SaveChanges();  
  9.     Console.WriteLine(_Context.Menus.AsNoTracking().First().MenuName);  
  10. }  



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多