2011-02-08 9 views
10

Z EF4, możliwe jest uzyskanie wygenerowanego SQL dla aktualizacji/wstawek, zamiast wykonywania go ... tak, jak można wyświetlić zapytanie SQL przed uruchomieniem.Entity Framework 4 - Uzyskaj wygenerowany SQL dla aktualizacji/wkładek

Powód jest taki, że mam zestaw funkcji pomocniczych, które wykonują polecenia SQL. Na przykład ...

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

który generuje ...

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

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

zwykle uruchomić kilka poleceń na pracy, więc przy każdym wywołaniu funkcji pomocnika, SQL są generowane i przechowywane. Kiedy wołam SaveChanges(), wszystkie polecenia są uruchamiane JEDNEGO razu.

Jedynym problemem jest to, że EF uruchamia swoje komendy oddzielnie za kulisami, a potem uruchamiam pozostałe. Idealnie byłoby uruchomić wszystko jako jedno polecenie.

Odpowiedz

5

Możesz uzyskać to w czasie projektowania z Sql Profiler, ale myślę, że masz na myśli, że chcesz go w czasie wykonywania. Oto przykład znalazłem na jak to zrobić:

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

Znaleziony here.

+0

Dzięki za tę odpowiedź, ale nie do końca to, czego potrzebuję. Po wstawieniu nowego obiektu lub pobraniu, a następnie aktualizacji istniejącego obiektu, muszę uzyskać SQL, który zostanie wygenerowany dla tych operacji. Nie mogę uzyskać obiektu EntityCommand z ObjectContext. –

+0

Tak więc jesteśmy jasne, czy próbujesz uzyskać go w czasie wykonywania, lub czas projektowania? To znaczy, czy próbujesz go zdobyć tylko raz, abyś mógł napisać proc, czy też musisz go jakoś zużyć w czasie wykonywania? –

+0

W czasie wykonywania. Chcę zasadniczo uzyskać wygenerowany SQL INSERT/UPDATE przed jego wykonaniem, połączyć go z własnymi instrukcjami, a następnie uruchomić wszystkie instrukcje jako jedno polecenie. –

Powiązane problemy