Entity Framework 4 - Получить сгенерированный SQL для обновлений/вложений

С EF4 можно ли получить сгенерированный SQL для Updates/Inserts, а не выполнять его... точно так же, как вы можете просмотреть SQL-запрос перед его запуском.

Причина в том, что у меня есть набор вспомогательных функций, которые выполняют команды SQL. Например...

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

Что генерирует...

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

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

Обычно я запускаю несколько команд для каждой операции, поэтому при каждом вызове вспомогательной функции SQL генерируется и сохраняется. Когда я вызываю SaveChanges(), все команды запускаются в ОДИН РАЗ.

Единственная проблема заключается в том, что EF выполняет свои команды отдельно за кулисами, а затем запускаю остальные сразу. Было бы идеальным запустить все как одну команду.

Ответ 1

Вы можете получить его во время разработки с помощью Sql Profiler, но я думаю, что вы имеете в виду, что хотите его во время выполнения. Вот пример, который я нашел о том, как это сделать:

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);
     }
}

Найдено здесь.