EF Core允许我们最终定义NoTracking dbcontext

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

支持只读上下文或dbset

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

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

有一个名为QueryTrackingBehavior的ChangeTracker属性,它接受一个QueryTrackingBehavior枚举,其选项是NoTracking和TrackAll。

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

public class bookContext:dbContext public booksreadonlycontext()changetracker.querytrackingbehavior=querytrackingbehavior.nottracking;公共DbSet}
         
          书籍获取;设置;等…
         

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

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

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

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

15“思考”EF Core允许我们最终定义NoTracking dbcontext

  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个表
    篇博文
    后注释
    CommtoPostMapping
    创建两个数据库集是否合理?一个用于获取文章(只读),另一个用于评论(读写)。或者,当从数据库中获取文章并将其显示在网站上时,禁用对queary的跟踪是否更简单?
    谢谢,
    Sergey Sypalo | sypalo.com

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

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


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

  5. 有没有可能改装成EF6.x?我已经叉EF局部一些懒惰加载魔术,我可以修补EF。不知何故,在EF6中加入这一点有多难?(如果ctx已经被设置为notrack,是否存在一个创建db - set的单点,我可以自动将其合并选项设置为notrack IIF ?)这个ctx范围的标志,我想加上我自己)。

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

答复肯塔克取消答复

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

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