是否可以在EF中执行存储过程之前获取查询字符串?

时间:2017-05-31 08:01:45

标签: c# sql entity-framework stored-procedures

是否有可能在执行之前获取为存储过程生成的实体框架的查询? 例如。调用sp

context.Test(1)

并获取字符串

  

exec [dbo] .Test 1

执行前

1 个答案:

答案 0 :(得分:2)

如果您正在使用Entity Framework 6,则可以使用查询拦截器在SQL生成和SQL执行之间注入代码。这是通过实施IDbInterceptor来完成的。您可以附加到以下“事件”:

namespace System.Data.Entity.Infrastructure.Interception
{
  public interface IDbCommandInterceptor : IDbInterceptor
  {
    void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext);

    void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext);

    void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext);

    void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext);

    void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext);

    void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext);
  }
}

您可以编写自定义拦截器来实现上面的界面,然后通过调用将其添加到您的EF中:

DbInterception.Add(new <your implementation>());

还有其他建议在这里查看实体框架生成的SQL:How do I view the SQL generated by the Entity Framework?,但这取决于您是想在执行之前只查看SQL还是执行某些操作。