【问题标题】:Prevent LinqPad from querying __MigrationHistory防止 LinqPad 查询 __MigrationHistory
【发布时间】:2018-03-23 15:27:42
【问题描述】:

这是关于性能优化的:

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

当我运行查询时,我看到了正确的结果,但我在“SQL”选项卡中看到 LinqPad(和/或 EF)发出 SQL 来检查迁移历史记录:

-- Region Parameters
-- p__linq__0: String [UserQuery]
-- EndRegion
SELECT 
"GroupBy1".A1 AS C1
FROM ( SELECT Count(1) AS A1
    FROM ARIANE_ADMIN."__MigrationHistory" "Extent1"
    WHERE "Extent1"."ContextKey" = :p__linq__0
)  "GroupBy1"
GO

-- Region Parameters
-- p__linq__0: String [UserQuery]
-- EndRegion
SELECT 
"GroupBy1".A1 AS C1
FROM ( SELECT Count(1) AS A1
    FROM "__MigrationHistory" "Extent1"
    WHERE "Extent1"."ContextKey" = :p__linq__0
)  "GroupBy1"
GO

SELECT 
"GroupBy1".A1 AS C1
FROM ( SELECT Count(1) AS A1
    FROM "__MigrationHistory" "Extent1"
)  "GroupBy1"
GO

SELECT 
"Extent1"."Id",
"Extent1"."ModelHash"
FROM "EdmMetadata" "Extent1"
ORDER BY "Extent1"."Id" DESC
FETCH FIRST 1 ROWS ONLY
GO

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

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

我的问题是:

  1. 我可以完全避免对“__MigrationHistory”的查询吗?
  2. 如果不是:有没有办法传递正确的参数而不是“[UserQuery]”,以便第一个查询返回正确的结果?

我使用 Devart dotconnect for Oracle 连接到 Oracle 服务器。

【问题讨论】:

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


【解决方案1】:

正如 Steve Greene 所建议的,您必须设置一个 null 初始值设定项。但不适用于您的 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多