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!
Dzięki za dokładną odpowiedź! – DanielEli
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
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