34

Najpierw używam kodu EntityFramework z migracjami. Z poziomu konsoli menedżera pakietów uruchamiam "aktualizacyjną bazę danych". Spowoduje to wykonanie opcji Configuration.Seed (kontekst), którą przesłoniłem.Gdzie mogę znaleźć dane wyjściowe konsoli lub debugowania z kodu wykonanego w oknie menedżera pakietów?

protected override void Seed(WebContext context) 
    { 

     Console.WriteLine("Console Test"); 
     Debug.WriteLine("Debug Test"); 
     Trace.WriteLine("Trace Test"); 
    } 

Gdzie mogę znaleźć to wyjście?

Co jeszcze lepszego, jak mogę wrócić do okna menedżera pakietów?

Thx, Dan

Odpowiedz

26

Gdzie mogę znaleźć, że wyjście?

Przepraszam, ale szybka odpowiedź jest właściwie nigdzie.

Aby być precyzyjnym, przynajmniej nie w konsoli menedżera pakietów.

Debug.WriteLine("Debug Test"); 
Trace.WriteLine("Trace Test"); 

Można zobaczyć wyjście z metod Debug... i Trace... jeśli dołączyć kolejny Visual Studio do debugowania programu Visual Studio, które instancja jest uruchomiona komenda update-database. Następnie w debugginie VS możesz zobaczyć dane wyjściowe w oknie Output.

Console.WriteLine("Console Test"); 

Można zobaczyć wyjście z metod Console... jeśli uruchomić migracje z poleceniem migrate.exe narzędziem wiersza która pochodzi z EF:

enter image description here

Jak zrobić wyjście I z powrotem do okno menedżera pakietów?

Mam tutaj także złe wieści, po szybkim „reflectoring”: z obecnym realizacji migracji EF to nie jest obsługiwane wyświetlanie niestandardowych informacji podczas wykonywania update-database (lub innego polecenia).

+0

Dzięki za dokładną odpowiedź! – DanielEli

+1

Kontynuacja - aby ominąć to ograniczenie, jeśli doda się pomocnika rejestrowania opartego na plikach do metody wywoływanej podczas migracji (np. 'Seed'), która zapisuje do pliku bez ścieżki (co oznacza, że ​​powinien on zapisywać do katalogu aplikacji) , czy wiesz, gdzie ten plik powinien się skończyć? Próbowałem szukać w folderze paczek, ale go tam nie ma. – drzaus

+2

Rozumiem, że jest to dość brzydki sposób obejścia problemu, ale można zapisać wynik wyjściowy w łańcuchu i wygenerować wyjątek z danymi na końcu elementu początkowego, aby uzyskać dane wyjściowe do konsoli. Zauważ, że jest to po prostu szybka i brudna sztuczka programisty. – Crypth

40

Szybkim hackem, którego używam, aby szybko znaleźć wartość w mojej metodzie Seed, jest po prostu wyrzucenie wyjątku z wartością, na której mi zależy, np.

throw new Exception(yourValue); 

Powoduje to błąd w Seed, ale mój wyjątek/wartość pojawia się w mojej konsoli menedżera pakietów.

+7

+1 Nikt nie powinien tego robić jako sugestia - ale okazało się to bardzo pomocne - dziękuję! – Nij

14

Uruchomienie polecenia drukowania SQL spowoduje zapisanie w konsoli programu Package Manager. Oto metoda pomocnika że używam:

/// <summary> 
    /// write a message to the Package Manager Console 
    /// </summary> 
    public void Debug(string s, params object[] args) 
    { 
     var fullString = string.Format(s, args).Replace("'", "''"); 
     Sql(string.Format("print '{0}'", fullString)); 
    } 
+5

Gdzie znajdę metodę Sql? –

+0

Jest to przydatne w podklasach 'DbMigration', ale nie w klasie' Configuration', w której 'Sql' nie jest dostępny. –

7

Moje potrzeby są podobne do Ciebie, więc pomyślałem, że je udokumentować tutaj w przypadku mogliby pomóc ktoś inny się. Moim celem było pokazanie wszystkich danych wyjściowych z migracji, w tym całego przebiegu sql, w ramach metody Seed. Efektem ubocznym tego rozwiązania będzie również możliwość wyświetlenia dowolnej wiadomości Debug.Write w swoim kodzie.

Najpierw utwórz narzędzie DebugMigrationsLogger, które będzie zapisywać wszystkie dane wyjściowe migracji do debugowania.WriteLine (dzięki http://whiteknight.github.io/2013/01/26/efcodeonlymigrations.html):

public class DebugMigrationsLogger : System.Data.Entity.Migrations.Infrastructure.MigrationsLogger 
{ 
    public override void Info(string message) 
    { 
     Debug.WriteLine(message); 
    } 
    public override void Verbose(string message) 
    { 
     Debug.WriteLine(message); 
    } 
    public override void Warning(string message) 
    { 
     Debug.WriteLine("WARNING: " + message); 
    } 
} 

Następnie upewnij się, że podklasa DbMigrationsConfiguration dla DbContext:

public class MyDbMigrationsConfiguration : DbMigrationsConfiguration<MyDbContext> 
{ 
    public MyDbMigrationsConfiguration() 
    { 
    } 
    protected override void Seed(MartusDb db) 
    { 
     //... 
    } 
} 

Następny uruchomić swoje migracje jako badanej jednostki na żądanie więc testowym biegacza może przechwytywać dane wyjściowe. Moje testy jednostkowe wygląda mniej więcej tak:

public void MigrateDb_Test() 
{ 
    var config = new MyDbMigrationsConfiguration { AutomaticMigrationDataLossAllowed = true }; 
    var migrator = new DbMigrator(config); 
    var loggingDecorator = new MigratorLoggingDecorator(migrator, new DebugMigrationsLogger()); 
    loggingDecorator.Update(); 
} 

Wreszcie ustawić Database.Log w konstruktorze DbContext:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
    { 
     Database.Log = message => Debug.WriteLine(message); 
    } 
} 

Teraz przy każdym uruchomieniu MigrateDb_Test() będzie można zobaczyć wszystkie dane wyjściowe, to znacznie ułatwiłem mi debugowanie migracji!

+1

Myślę, że to jest świetna odpowiedź. Wynik jest dostępny jako część wyników testu w oknie Eksploratora testów w Visual Studio. Zauważ, że klasa Configuration będzie prawdopodobnie wewnętrzna, ale możesz po prostu dodać [assembly: InternalsVisibleTo ("MyUnitTestProject")] do tej klasy, aby umożliwić dostęp. – Craig

-1

Dirty obejście rozszerzające odpowiedź George'a.

protected override void Seed(YourContext context) 
{ 
    using (var seedout = new StringWriter()) 
    { 
     // do your work 
     context.Authors.AddOrUpdate(x => x.Id, 
      new Author() { Id = 1, Name = "Jane Austen" } 
      ); 

     // some message 
     seedout.WriteLine("some message"); 

     // commit your work 
     context.SaveChanges(); 

     seedout.WriteLine("Seed successfully completed."); 

     // dummy exception to show message on package manager console 
     throw new Exception(seedout.ToString()); 
    } 
} 
Powiązane problemy