entity-framework - 오라클 - 엔티티 프레임워크 단점




Entity Framework에서 생성 된 SQL을 보려면 어떻게합니까? (12)

DbContext를 사용하는 경우 다음을 수행하여 SQL을 얻을 수 있습니다.

var result = from i in myContext.appEntities
             select new Model
             {
                 field = i.stuff,
             };
var sql = result.ToString();

엔티티 프레임 워크에 의해 생성 된 SQL은 어떻게 볼 수 있습니까?

(내 특별한 경우에는 mysql 공급자를 사용하고 있습니다 - 중요하다면)


EF 4.1에서 다음을 수행 할 수 있습니다.

var result = from x in appEntities
             where x.id = 32
             select x;

System.Diagnostics.Trace.WriteLine(result .ToString());

그러면 생성 된 SQL이 제공됩니다.


EF6.1부터는 인터셉터를 사용하여 데이터베이스 로거를 등록 할 수 있습니다. 파일에 대한 "인터셉터"및 "데이터베이스 작업 로그"장을 참조 here

<interceptors> 
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
      <parameter value="C:\Temp\LogOutput.txt"/> 
      <parameter value="true" type="System.Boolean"/> 
    </parameters> 
  </interceptor> 
</interceptors>

Entity Framework 6 이상을 사용하는 경우 Visual Studio에서 출력 SQL을 보려면 (이전처럼) 새로운 로깅 / 차단 기능을 사용해야합니다.

다음 줄을 추가하면 Visual Studio 출력 패널에 생성 된 SQL과 추가 실행 관련 세부 정보가 표시됩니다.

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
    // query the database using EF here.
}

이 멋진 블로그 시리즈의 EF6 로그인에 대한 추가 정보 : http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

참고 : DEBUG 모드에서 프로젝트를 실행하고 있는지 확인하십시오.


글쎄, 그 순간에 그 목적을 위해 익스프레스 프로파일 러를 사용하고 있습니다, 단점은 MS SQL 서버에서만 작동한다는 것입니다. 이 도구는 https://expressprofiler.codeplex.com/ 에서 찾을 수 있습니다.


나는 방금 이것을했다 :

IQueryable<Product> query = EntitySet.Where(p => p.Id == id);
Debug.WriteLine(query);

결과는 출력 :

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Code] AS [Code], 
    [Extent1].[Name] AS [Name], 
    [Extent2].[Id] AS [Id1], 
    [Extent2].[FileName] AS [FileName], 
    FROM  [dbo].[Products] AS [Extent1]
    INNER JOIN [dbo].[PersistedFiles] AS [Extent2] ON [Extent1].[PersistedFileId] = [Extent2].[Id]
    WHERE [Extent1].[Id] = @p__linq__0

내 대답은 EF 핵심을 다룹니다. 이 github 문제DbContext 구성에 관한 문서를 참조 합니다 .

단순한

ConsoleLoggerProvider를 사용하려면 여기표시된대로 DbContext 클래스 ( YourCustomDbContext )의 OnConfiguring 메서드를 재정의하십시오. 쿼리가 콘솔에 기록되어야합니다 :

public class YourCustomDbContext : DbContext
{
    #region DefineLoggerFactory
    public static readonly LoggerFactory MyLoggerFactory
        = new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});
    #endregion


    #region RegisterLoggerFactory
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseLoggerFactory(MyLoggerFactory); // Warning: Do not create a new ILoggerFactory instance each time                
    #endregion
}

복잡한

이 복잡한 경우 DbContext OnConfiguring 메서드를 재정의 DbContext OnConfiguring . "이 방법은 테스트가 전체 데이터베이스를 대상으로하지 않는 한 자체 테스트에 적합하지 않습니다."

이 복합 사례는 다음을 사용합니다.

  • Startup 클래스 ConfigureServices 메서드의 IServiceCollection ( OnConfiguring 메서드를 재정의하는 대신 DbContext 와 사용할 ILoggerProvider 간의 결합이 느슨 함)
  • 위에 표시된 ConsoleLoggerProvider 구현을 사용하는 대신 ILoggerProvider 구현 (우리의 구현은 File에 로그하는 방법을 보여줍니다 ( EF Core와 함께 제공되는 File Logging Provider 는 표시되지 않습니다))

이렇게 :

public class Startup

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        var lf = new LoggerFactory();
        lf.AddProvider(new MyLoggerProvider());

        services.AddDbContext<YOUR_DB_CONTEXT>(optionsBuilder => optionsBuilder
                .UseSqlServer(connection_string)
                //Using the LoggerFactory 
                .UseLoggerFactory(lf));
        ...
    }
}

다음은 MyLoggerProvider (및 구성 할 수있는 파일에 로그를 추가하는 MyLoggerProvider 의 구현입니다. EF 핵심 쿼리가 파일에 나타납니다.)

public class MyLoggerProvider : ILoggerProvider
{
    public ILogger CreateLogger(string categoryName)
    {
        return new MyLogger();
    }

    public void Dispose()
    { }

    private class MyLogger : ILogger
    {
        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception));
            Console.WriteLine(formatter(state, exception));
        }

        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }
    } 
}

다음을 수행 할 수 있습니다.

IQueryable query = from x in appEntities
             where x.id = 32
             select x;

var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

또는 EF6 :

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query)
            .ToTraceString();

그러면 생성 된 SQL이 제공됩니다.


매개 변수 값 ( @p_linq_0 뿐만 아니라 값도)을 IDbCommandInterceptor 를 사용하고 일부 로깅을 ReaderExecuted 메소드에 추가 할 수 있습니다.


쿼리를 항상 편리하게 사용하려면 코드를 변경하지 말고 DbContext에 추가하고 Visual Studio의 출력 창에서 확인하십시오.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.Log = (query)=> Debug.Write(query);
    }

@Matt Nibecker 대답과 비슷하지만, 쿼리가 필요할 때마다 현재 코드에 추가 할 필요가 없습니다.


필자의 경우 EF 6+의 경우 직접 실행 창에서 쿼리 문자열을 찾는 대신 다음을 사용하십시오.

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query).ToTraceString();

나는 이것을 사용하여 생성 된 SQL 명령을 얻지 않아야했다.

var sql = ((System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>)query).ToString();

물론 익명의 서명은 다를 수 있습니다.

HTH.


IQueryable query = from x in appEntities
                   where x.id = 32
                   select x;
var queryString = query.ToString();

SQL 쿼리를 반환합니다. EntityFramework 6의 datacontext를 사용하여 작업하기





ado.net