1.目前EF版本是6.0,生成的数据库实体模型都是DbSet<T>类型
2.默认情况下对于数据的访问都是启用模型跟踪
- 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()方法
- //
- // 摘要:
- // 表示针对 DbContext 的 LINQ to Entities 查询。
- //
- // 类型参数:
- // TResult:
- // 要查询的实体的类型。
- [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "Name is intentional")]
- public class DbQuery<TResult> : IOrderedQueryable<TResult>, IQueryable<TResult>, IEnumerable<TResult>, IOrderedQueryable, IQueryable, IEnumerable, ......
- {
- //
- // 摘要:
- // 返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。
- //
- // 返回结果:
- // 应用了 NoTracking 的新查询。
- public virtual DbQuery<TResult> AsNoTracking();
4.特别说明:对于使用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);
- }
|