ef core让我们最终定义notracking dbContexts

回到2012年,我向EF6添加了一个功能请求,允许我们定义一个上下文,它永远不会跟踪从数据库中检索到的实体。

(支持只读上下文或DbSet)

如果您有一个用于只读数据的dbContext,那么这就不必在所有查询中添加asNotTracking。或者更重要的是,如果您的dbContext用于将要断开连接的数据,因此从不跟踪后期查询。这意味着Web API或服务或控制器。如果您检索大量数据,并且没有更新计划,那么跟踪可能会很昂贵。而且必须记住在每个查询中添加AsNoTracking是一个PIA。

我刚刚发现,这是可能的EF核心,我认为它甚至在EF核心1.0版本!

有一个名为QueryTrackingBehavior的ChangeTracker属性,它采用了一个QueryTrackingBehavior枚举,其选项为NotTracking和TrackAll。

有很多地方可以使用它,但我对感到兴奋的是,将它直接放置在dbContext的构造函数中,使上下文默认为从不跟踪任何实体。

public class bookContext:dbContext public booksreadonlycontext()changetracker.querytrackingbehavior=querytrackingbehavior.nottracking;}公用数据库集
         
          书[得到;设置;]等。
         

一个快速测试,我检索了一些书,检查了changetracker。条目返回0,为了证明这是我5年来一直梦想的事情!感谢英孚团队!

console.writeline($“跟踪的实体:context.changetracker.entries().count()”);

需要注意的另一点是,正如您一直能够使用DbSet的AsNoTracking方法来关闭对特定查询的跟踪一样,现在,您可以使用Astracking打开特定查询的跟踪。

报名参加我的通讯所以你不要错过我的会议和多元化课程公告!

关于“ef core让我们最终定义notracking dbContexts

  1. 嗨,朱莉,

    您认为在EF 6中(在Web API中用于即时JSON序列化)这样做有什么性能优势吗?

    var productsForCategory =(来自context.Products.AsNoTracking()中的p)
    其中p.categoryname==selectedCategory
    选择p) .ToList ();

    在这上面

    var productsforcategory=(来自context.products中的p)
    其中p.categoryname==selectedCategory
    选择p) .ToList ();

  2. 嗨,朱莉,
    读了你的文章,我想起了我自己学习EF基础的一段时间,并考虑实体跟踪为简单的博客。
    例如,如果数据库中有3个表
    博客作者
    PostComments
    通信映射
    创建两个dbset是否有意义,一个用于获取文章(只读),另一个用于评论(读写),或者在从数据库获取文章时,为了在网站上显示它们而禁用对队列的跟踪更简单?
    谢谢,
    Sergey Sypalo sypalo.com

  3. 我错了吗?我认为在EF6中,在上下文的ctor中使用以下代码总是可能的:
    configuration.autodetectchangesEnabled=false

    1. 不,这是不同的。这只决定当您对被跟踪对象进行更改时,EF是否会立即更新更改跟踪器中的状态。

  4. In EF.Core 1.1,有没有比下面更好的方法同时使用FindAsync和AsNoTracking?我似乎无法组合. asnotracking (). findasync (id)。

    “‘
    var previousBehavior=_context.changeTracker.queryTrackingBehavior;
    _context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    var student = waiting _context.Students.FindAsync(id);
    _ context.changeTracker.queryTrackingBehavior=PreviousBehavior;
    if (student == null)
    {
    return notfound();
    }
    “‘

  5. 有没有可能把这个改装成EF 6.x?我已经在本地为一些懒惰的加载魔法分叉了ef,所以我可以修补我的EF。把这个加到EF 6上有多难?(如果CTX设置为NotRack,是否有一个创建DB集的单点可以自动将其MergeOption设置为NotRack IIF?这个CTX宽的旗子。

    1. 没有线索。不知道。我记得几年前我试过各种各样的把戏来制造一个毯子“不跟踪”上下文。对不起。.

留下答复谢尔盖取消回复

您的电子邮件地址将不会发布。已标记必需字段*

这个站点使用Akismet来减少垃圾邮件。了解如何处理评论数据.