2011-02-08 16 views
10

Con EF4, è possibile ottenere l'SQL generato per Aggiornamenti/Inserti anziché eseguirlo ... proprio come è possibile visualizzare la query SQL prima dell'esecuzione.Entity Framework 4 - Ottieni SQL generato per aggiornamenti/inserti

Il motivo è, ho un set di funzioni di supporto che eseguono comandi SQL. Per esempio ...

Decrement<Category>("ProductCount", categoryID); 
SetNull<Product>("CategoryID", productID); 

che genera ...

UPDATE Categories 
SET ProductCount = ProductCount - 1 
WHERE CategoryID = @CategoryID; 

UPDATE Products 
SET CategoryID = NULL 
WHERE CategoryID = @ProductID; 

Io di solito eseguire diversi comandi per il funzionamento, quindi con ogni chiamata funzione di supporto, l'SQL viene generato e memorizzato. Quando chiamo SaveChanges(), tutti i comandi vengono eseguiti una volta sola.

L'unico problema è che EF esegue i suoi comandi separatamente dietro le quinte, quindi eseguo gli altri subito dopo. Sarebbe l'ideale per eseguire tutto come un unico comando.

risposta

5

È possibile ottenerlo in fase di progettazione con Sql Profiler, ma penso che tu voglia significare che lo desideri in fase di esecuzione. Ecco un esempio che ho trovato su come farlo:

public static void WriteGeneratedSql(EntityCommand cmd) 
{ 
    cmd.Prepare(); 

    IServiceProvider isp = (IServiceProvider)EntityProviderFactory.Instance; 

    DbProviderServices mps = (DbProviderServices)isp.GetService(typeof(DbProviderServices)); 

    EntityCommandDefinition definition = (EntityCommandDefinition)mps.CreateCommandDefinition(cmd); 

    int commandId = 1; 

    foreach (string commandText in definition.MappedCommands) 
    { 
      Console.WriteLine("Generated Command {0}:", commandId); 
      commandId++; 
      Console.WriteLine(commandText); 
    } 
} 

Trovato here.

+0

Grazie per questa risposta, ma non è proprio quello di cui ho bisogno. Dopo aver inserito un nuovo oggetto o recuperato e poi aggiornato un oggetto esistente, ho bisogno di ottenere l'SQL che viene generato per queste operazioni. Non riesco a ottenere un oggetto EntityCommand da ObjectContext. –

+0

Solo così siamo chiari, stai cercando di ottenerlo in fase di esecuzione o in fase di progettazione? Cioè, stai cercando di ottenerlo solo una volta in modo che tu possa scrivere un proc o hai bisogno di consumarlo in qualche modo in fase di runtime? –

+0

In fase di esecuzione. Voglio fondamentalmente ottenere l'SQL INSERT/UPDATE generato prima che venga eseguito, combinarlo con le mie stesse affermazioni, quindi eseguire tutte le istruzioni come un unico comando. –

Problemi correlati