Entity Framework 6 - How can I view the SQL that will be generated for an insert before calling SaveChanges

前端 未结 4 911
余生分开走
余生分开走 2021-02-02 08:19

In Entity Framework 6, is it possible to view the SQL that will be executed for an insert before calling SaveChanges?

using (var db =          


        
相关标签:
4条回答
  • 2021-02-02 08:53

    use Interceptors for detail see this link

    add this in to .config file

    <interceptors> 
      <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
        <parameters> 
          <parameter value="C:\Temp\LogOutput.txt"/> 
        </parameters> 
      </interceptor> 
    </interceptors>
    
    0 讨论(0)
  • 2021-02-02 09:01

    The easiest way in EF6 To have the query always handy, without changing code is to add this to your DbContext and then just check the query on the output window in visual studio, while debugging.

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

    EDIT

    LINQPad is also a good option to debug Linq with and can also show the SQL queries.

    0 讨论(0)
  • 2021-02-02 09:06

    There is no equivalent of the query.ToString() AFAIK. You can eventually use DbContext.Database.Log property:

    db.Database.Log = s =>
    {
        // You can put a breakpoint here and examine s with the TextVisualizer
        // Note that only some of the s values are SQL statements
        Debug.Print(s);
    };
    db.SaveChanges();
    
    0 讨论(0)
  • 2021-02-02 09:13

    Another option (if I understand your question correctly), would be to use an IDbCommandInterceptor implementation, which seemingly allows you to inspect SQL commands before they are executed (I hedge my words as I have not used this myself).

    Something like this:

    public class CommandInterceptor : IDbCommandInterceptor
    {
        public void NonQueryExecuting(
            DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            // do whatever with command.CommandText
        }
    }
    

    Register it using the DBInterception class available in EF in your context static constructor:

    static StuffEntities()
    {
        Database.SetInitializer<StuffEntities>(null); // or however you have it
        System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new CommandInterceptor());
    }
    
    0 讨论(0)
提交回复
热议问题