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打开特定查询的跟踪。

注册我的新闻稿所以你不要错过我的会议和多元化课程公告!

15“思考”ef core让我们最终定义notracking dbContexts

  1. 嗨,朱莉,

    您认为使用EF6(在用于即时JSON序列化的Web API中)执行此操作有任何性能优势吗?

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

    在这上面

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

  2. 嗨,朱莉,
    读了你的文章,我记得自己不久前学过基础英语,还想着实体跟踪简单的博客。
    例如,如果数据库中有3个表
    博客作者
    后注释
    通信映射
    创建两个数据库集是否合理?一个用于获取文章(只读),另一个用于评论(读写)。或者在从数据库获取文章时,为了在网站上显示它们而禁用对队列的跟踪更简单?
    谢谢,
    Sergey Sypalo sypalo.com

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

  4. 在ef.core 1.1中,有没有比下面更好的方法同时使用findasync和asnotracking?我似乎无法组合.asnotracking().findasync(id)。


    var previousBehavior=_context.changeTracker.queryTrackingBehavior;
    _ context.changetracker.querytrackingbehavior=querytrackingbehavior.nottracking;
    var student=等待上下文。students.findasync(id);
    _ context.changeTracker.queryTrackingBehavior=PreviousBehavior;
    if(student==空)
    {
    return notfound();
    }

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

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

答复朱莉取消答复

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

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