2012-08-16 12 views
19

Przeprowadzam migrację aplikacji MVC 3 z EF 4.3 do EF 5. Zauważyłem, że EF 5 oczekuje kolumny CreatedOn w tabeli __MigrationHistory, która nie istnieje, ponieważ migracje zostały utworzone przez starsza wersja.Entity Framework 5 oczekuje, że kolumna CreatedOn z tabeli MigrationHistory

Jak rozwiązać ten problem bez usuwania mojej historii migracji? Myślę o zapytaniu wywnioskować wartość kolumny, od nazwy migracji, który jest w następującym formacie:

201203111201542_MigrationName 
+0

To wydaje się być sprzeczne z MiniProfiler: http://community.miniprofiler.com/permalinks/99/sqlexception-on-ef-5 -w-net-4-5 – CMircea

Odpowiedz

5

Kolumna createdon nie jest już wymagane. Próbujemy z niego zapytać, aby ustalić, czy musimy go usunąć. Oznacza to, że aktualizujesz z 4.3 na 5.

+7

Nie widzę odpowiedzi na oryginalne pytanie - "jak rozwiązać ..." – Spongman

+5

@SpongeMan: Otrzymałem ten wyjątek, ale Okazało się, że przypadkowo opuściłem Visual Studio skonfigurowane tak, aby łamać wszystkie wyjątki, nie tylko nieobsługiwane. Andrew nie powiedział tego wprost, ale postanawia wyłączyć łamanie wyjątków pierwszej szansy. Debuguj-> Wyjątki, a następnie usuń zaznaczenie kolumny Wygenerowany. – HiredMind

5

Wydaje się, że w wersji EF kod jest pierwszy z włączonymi migracjami po aktualizacji z EF4. * do wersji EF 5.0. A to w połączeniu z MiniProfilerem. Tabela istniała w dbo._MigrationHistory w tabelach systemowych.

spróbować zrobić kilka rzeczy:

  1. Możesz dodać createdon (DateTime) Kolumna ręcznie na stole dbo._MigrationHistory w folderze tabel systemowych.
  2. Możesz zatrzymać wykrywanie zmian, ustawiając Configuration.AutoDetectChangesEnabled = false;
  3. Skomentuj tę linię MiniProfilerEF.Initialize(), wyłączając profilowanie EF.

Oto przykład metody nasiennej służącej do dodawania kolumny CreatedOn. Ta kolumna zostanie usunięta przy każdym zainicjowaniu kontekstu. Metoda seed znajduje się w klasie Configuration kontekstu.

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // Hide error Invalid column name 'CreatedOn' from mini profiler. 
     context.Database.ExecuteSqlCommand(
      @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn') 
       ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME()); 
     "); 
    } 
} 
+0

AutoDetectChanges = false faktycznie nie rozwiązuje problemu, występuje również w przypadku migracji "ręcznych". Ale oczywiście masz rację z pozostałymi dwoma rozwiązaniami. Dzięki. –

+0

hmmm myślałem, że testowałem to poprawnie: p dziękuję za informacje –

+0

Dodanie pola CreatedOn również nie działa, ponieważ następna migracja natychmiast go opuści i zacznie się od nowa. –

6

Tak jak powiedział Filip Cornelissen, jest to rzecz między MiniProfiler.EF a Entity Framework 5.0.

Rozwiązanie/ukrycie problemu jest łatwiejsze niż mogłoby się wydawać. Jest to tylko "problem z debugowaniem", ponieważ błąd, który otrzymasz, ma miejsce tylko w okresie tworzenia instancji (sprawdzanie nowych migracji), a błąd jest "Wyjątkiem SQL Unhandeld".

więc rozwiązania tego problemu jest proste:

Go w Visual Studio do zakładki "DEBUG". Uderz w element "Wyjątki". W nowym oknie dialogowym otworzysz drzewo "Wyjątki środowiska wykonawczego języka wspólnego". Zgodnie z „System.Data.SqlClient, usuń zaznaczenie pola wyboru zarówno po "System.Data.SqlClient.SqlException". Dodaj go, jeśli go tam nie ma.

I off ya go!

+11

Ale to będzie tłumić wszystkie SqlExceptions .. –

+2

Tak będzie. Ale o ile wiem, EF nie wyrzuca (nieobsługiwanych) wyjątków SQL. Więc całkiem bezpiecznie jest zignorować te wyjątki w twoich projektach zasilanych EF. –

4

Według Filip Cornelissen odpowiedź następujący skrypt rozwiązuje ten problem:

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL 

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE() 
GO 
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE() 
+5

Tak, ale to tylko tymczasowe. Kolumna CreatedOn zostanie ponownie usunięta! To tylko kwestia czasu. –

3

Oto obejście, którego używam.Osobiście, jestem OK z naciskając dwukrotnie zieloną strzałkę (Start debugowania, a następnie dalej), ale jeśli naprawdę chcesz go zatrzymać łamanie, spróbuj tego postu Budowanie wydarzenie, które usunie MiniProfiler PDB:

del "$(TargetDir)MiniProfiler.pdb" /q /s 

UPDATE : jeśli to zbyt wiele pracy dla ciebie stworzyłem NuGet package:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix 
Powiązane problemy