标签档案:WebAPI

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.NoTracking;公共DbSet}
         
          书[得到;设置;]等。
         

A quick test where I retrieved some books and the inspected the ChangeTracker.Entries returned 0,为了证明这是我5年来一直梦想的事情!感谢英孚的团队!

Console.WriteLine(     $"Tracked Entities: {context.ChangeTracker.Entries().Count()}");

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