防止 LinqPad 查询 __MigrationHistory
Prevent LinqPad from querying __MigrationHistory
这是关于性能优化的:
我使用 LinqPad 通过 EF 6 DbContext 访问数据库。首先使用代码创建数据库。
当我 运行 查询时,我看到了正确的结果,但我在 "SQL"-选项卡中看到 LinqPad (and/or 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 访问数据库,因此额外的查询成本超过一秒。
我的问题是:
- 我可以避免对“__MigrationHistory”的查询吗?
- 如果不是:有没有办法传递正确的参数而不是'[UserQuery]',以便第一个查询returns得到正确的结果?
我使用 Devart dotconnect for Oracle 连接到 Oracle 服务器。
正如 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();
}
}
这是关于性能优化的:
我使用 LinqPad 通过 EF 6 DbContext 访问数据库。首先使用代码创建数据库。
当我 运行 查询时,我看到了正确的结果,但我在 "SQL"-选项卡中看到 LinqPad (and/or 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 访问数据库,因此额外的查询成本超过一秒。
我的问题是:
- 我可以避免对“__MigrationHistory”的查询吗?
- 如果不是:有没有办法传递正确的参数而不是'[UserQuery]',以便第一个查询returns得到正确的结果?
我使用 Devart dotconnect for Oracle 连接到 Oracle 服务器。
正如 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();
}
}