2012-02-14 17 views
4

我意识到这个类似的问题已经被问了几次,并且我已经尝试了这些问题中的建议而没有成功。如何使用实体框架4.3(代码优先)和SQL Azure数据库登录SQL

我正在使用实体框架(4.3)并针对SQL Azure(在联合数据库上)运行。我希望能够记录实体框架正在生成的SQL。

我已经使用了Entity Profiler Framework,虽然这在开发过程中很有帮助,但我不确定它在生产过程中会有所帮助。

我无法使用SQL Profiler,因为这是一个SQL Azure数据库。

我试过使用EFTracingProvider并按照here中的步骤操作。不幸的是,当我尝试执行我的第一个命令(使用适当的联邦)时,我收到一个异常,指出“指定的方法不受支持”。

产生错误的代码如下:

public MyContext(int tenantId) 
    : base(CreateTracingConnection("TheDb"), true) 
{ 
    const string FederationCmdText = 
     "USE FEDERATION TenantFederation(CustomerId = {0}) WITH RESET, FILTERING=ON"; 

    ((IObjectContextAdapter)this).ObjectContext.EnableTracing(); 

    ((IObjectContextAdapter)this).ObjectContext.Connection.Open(); 

    // This is the line which throws the exception 
    this.Database.ExecuteSqlCommand(string.Format(FederationCmdText, tenantId));   
} 

这里的例外:

Specified method is not supported. 
at EFProviderWrapperToolkit.DbConnectionWrapper.CreateDbCommand() 
at System.Data.Common.DbConnection.CreateCommand() 
... 

因此,这里是我的问题:

  • 是EFTracingProvider为首选的方法记录SQL查询(全局)?
  • 如果是这样,任何想法,为什么我得到上述异常?
  • 如果没有,是否有另一种机制可以让我记录实体框架生成的所有SQL?

感谢您的帮助, 埃里克

回答

5

的问题,我也陷入了是因为我相信,在EFTracingProvider没有直接执行SQL的支持。为了要解决这个问题,一种解决方案是以下(我在Q &甲发现从here

创建下面的类:

public class DbTracingConnection : EFTracingConnection 
{ 
    protected override DbCommand CreateDbCommand() 
    { 
     return this.WrappedConnection.CreateCommand(); 
    } 
} 

当创建连接时,使用上面的类,而不是的EFTracingConnection。

+0

这似乎是作者推荐的。 [Here](http://efwrappers.codeplex.com/)在他们说的“已知问题”中用'context.Connection.GetStoreConnection()。CreateCommand()'执行存储命令。所以有效地做你做的,并使用包装连接:) – slawek 2013-12-16 16:53:30

相关问题