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

一、EF中用户查询非跟踪数据的方式是使用DBSet.AsNoTracking()

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);
}




更多:

EF实体对象变动跟踪

EntiryFramework中事务操作实例

EntiryFramework中事务操作(三)事务回滚数据模型和数据库不对应问题

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值