AsNoTracking()的全局设置?

Vin*_*erg 51 entity-framework change-tracking

原来我相信

context.Configuration.AutoDetectChangesEnabled = false;
Run Code Online (Sandbox Code Playgroud)

会禁用更改跟踪.但不是.目前我需要AsNoTracking()在所有LINQ查询上使用(对于我的只读层).是否有全局设置禁用DbContext上的跟踪?

Lad*_*nka 33

如何在派生的上下文中公开这样的方法并将其用于查询:

public IQueryable<T> GetQuery<T>() where T : class {
    return this.Set<T>().AsNoTracking();
}
Run Code Online (Sandbox Code Playgroud)

AsNoTracking全局设置是不可能的.您必须根据每个查询或每个查询ObjectSet(不是DbSet)设置它.后一种方法需要使用ObjectContextAPI.

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var set = objectContext.CreateObjectSet<T>();
set.MergeOption = MergeOption.NoTracking;
// And use set for queries
Run Code Online (Sandbox Code Playgroud)

  • 当仅公开像 GetQuery&lt;T&gt; 这样的单个实体时,如何在实体之间进行联接?感谢您的回复。 (2认同)

Amr*_*rhy 21

由于此问题未使用特定EF版本标记,因此我想提及在EF Core中,可以在上下文级别配置行为.

您还可以在上下文实例级别更改默认跟踪行为:

using (var context = new BloggingContext())
{
    context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

    var blogs = context.Blogs.ToList();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您有其他设置(例如连接字符串),那么 DbContextOptions 会有所帮助。例如: `var dbContextOptionsBuilder = new DbContextOptionsBuilder&lt;BloggingContext&gt;().UseSqlServer("SQL 连接到博客数据库").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);`。然后使用 var bloggingContext = new BloggingContext(dbContextOptionsBuilder.Options) 创建上下文。 (3认同)

Ale*_* I. 13

EntityFramework.Core 中,这很容易。

为此,您可以使用UseQueryTrackingBehavior方法。

代码片段在这里:

services.AddDbContext<DatabaseContext>(options =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    options.UseSqlServer(databaseSettings.DefaultConnection);
});
Run Code Online (Sandbox Code Playgroud)