阻止LinqPad查询__MigrationHistory

时间:2018-03-23 15:27:43

标签: entity-framework ef-code-first linqpad

这是关于性能优化的:

我使用LinqPad使用EF 6 DbContext访问数据库。首先使用代码创建数据库。

当我运行查询时,我看到了正确的结果,但是我在“SQL”标签中看到LinqPad(和/或EF)使用SQL来检查迁移历史记录:

kernel = vs.get_variable(
"kernel", filter_size + [total_arg_size_depth, num_features], dtype=dtype)

只有这样才有实际的查询。

由于我通常通过多层VPN访问数据库,因此额外的查询花费的时间超过一秒。

我的问题是:

  1. 我可以完全避免查询“__MigrationHistory”吗?
  2. 如果没有:有没有办法传递正确的参数而不是'[UserQuery]',以便第一个查询返回正确的结果?
  3. 我使用Devart dotconnect for Oracle连接到Oracle服务器。

1 个答案:

答案 0 :(得分:0)

正如Steve Greene所说,你必须设置一个空的初始化器。但不是你的DbContext。必须为LinqPad动态创建的UserQuery-Type设置它。

可以通过写

来完成
Database.SetInitializer<UserQuery>(null);

在每个LinqPad查询的开头。

更通用的方法是使用反射在您的dll中设置它。

添加此扩展方法

public static class DbContextExtensions
{
    public static void RemoveLinqpadInitializer(this DbContext context)
    {
        var contextType = context.GetType();
        if (contextType.Name == "UserQuery")
        {
            var setInitializer = typeof(Database).GetMethod(nameof(Database.SetInitializer))?.MakeGenericMethod(contextType);
            setInitializer?.Invoke(null, new object[] {null});
        }
    }
}

并在你的DbContext中调用它:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        Database.SetInitializer<MyDbContext>(null); // or any other initializer
        this.RemoveLinqpadInitializer();
    }
}