本文共 1394 字,大约阅读时间需要 4 分钟。
一、EF中用户查询非跟踪数据的方式是使用DBSet.AsNoTracking()
1.目前EF版本是6.0,生成的数据库实体模型都是DbSet<T>类型
2.默认情况下对于数据的访问都是启用模型跟踪
ctx.Configuration.AutoDetectChangesEnabled=true
自动调用DbContext.ChangeTracker.DetectChanges的方法:
DbSet.FindDbSet.LocalDbSet.RemoveDbSet.AddDbSet.AttachDbContext.SaveChangesDbContext.GetValidationErrorsDbContex.EntryDbChangeTracker.Entries3.如果对于不需要修改的数据可以使用AsNoTracking()方法
// // 摘要: // 表示针对 DbContext 的 LINQ to Entities 查询。 // // 类型参数: // TResult: // 要查询的实体的类型。 [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "Name is intentional")] public class DbQuery4.特别说明:对于使用AsNoTracking()的数据不能用于修改。: IOrderedQueryable , IQueryable , IEnumerable , IOrderedQueryable, IQueryable, IEnumerable, ...... { // // 摘要: // 返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。 // // 返回结果: // 应用了 NoTracking 的新查询。 public virtual DbQuery AsNoTracking();
//AsNoTracking 获取到的数据不能用作修改using (MenuModel _Context = new MenuModel()){ Menu.Menu first = _Context.Menus.AsNoTracking().First(); Console.WriteLine(first.MenuName); first.MenuName = "abc"; first.Model.ModelName = "123"; _Context.SaveChanges(); Console.WriteLine(_Context.Menus.AsNoTracking().First().MenuName);}更多: