2013-03-26 17 views
7

Mam aplikację, która używa dwóch oddzielnych modeli przechowywanych w jednej bazie danych. Pierwszy model jest skonfigurowany z migracjami i jest tym, który utworzył dane migracyjne w bazie danych. Drugi to bardzo prosty model, który nie wymaga żadnej walidacji modelu - używane tabele istnieją i mają odpowiednią strukturę. Drugi kontekst działa dobrze w oddzielnej bazie danych o tej samej strukturze tabeli.Możliwe, że DbContext Ignoruje dane migracji/wersji w bazie danych?

Problem polega na tym, że zawiedzie podczas pracy w tej samej bazie danych z pierwszym modelem, ponieważ zapewnia ona pewien rodzaj sprawdzania poprawności modelu. Narzeka, że ​​kontekst zmienił się od czasu ostatniej aktualizacji, ale oczywiście dane dotyczące migracji nie zawierają żadnych informacji o tabelach drugiego kontekstu.

Czy można wyłączyć walidację meta danych dla kontekstu i po prostu pozwolić, aby drugi kontekst działał na podstawie tabel tak, jak jest, skoro wiem, że działa?

w konstruktorze kontekstu, ale bez efektu.

+0

Chyba rozumiem, co próbujesz zrobić. Czy w ogóle korzystasz z DBInitializer? – timothyclifford

+0

Configuration.AutoDetectChangesEnabled = false; Wyłącza śledzenie zmian w jednostkach, które czasami są potrzebne ze względu na wydajność. Zobacz http://blog.oneunicorn.com/2012/03/11/secrets-of-detectchanges-part-2-when-is-detectchanges-called-automatically/. –

Odpowiedz

10

Rozwiązaniem jest zastosowanie zaimplementowania inicjalizatora bazy danych "do niczego", który zasadniczo nie działa.

public class QueueMessageManagerContextInitializer : IDatabaseInitializer<QueueMessageManagerContext> 
{ 
    protected void Seed(QueueMessageManagerContext context) 
    {    
    } 

    public void InitializeDatabase(QueueMessageManagerContext context) 
    { 
     // do nothing 
     Seed(context); 
    } 
} 

Aby użyć jednego kodu startowego czasu niż:

[ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     //Database.SetInitializer<QueueMessageManagerContext>(new DropCreateDatabaseIfModelChanges<QueueMessageManagerContext>()); 
     Database.SetInitializer<QueueMessageManagerContext>(new QueueMessageManagerContextInitializer()); 
    } 

Proste ale nie oczywiste rozwiązanie.

Edit:

jeszcze prostsze rozwiązanie: Po prostu przekaż NULL metody SetInitializer():

Database.SetInitializer<QueueMessageManagerContext>(null); 
+1

Niech mnie szlag trafi :) fajnie! – timothyclifford

+1

"Jeszcze prostsze rozwiązanie" zadziałało dla mnie. – Andy

+0

Jeśli okaże się, że nie działa zgodnie z oczekiwaniami, sprawdź sekcję EF pliku konfiguracyjnego. Upewnij się, że twój kontekst wyłączył DatabaseInitialization = "true". Straciłem zbyt wiele godzin na to i nikt nie wspomina o tym w swoich odpowiedziach tutaj. Więcej informacji na temat tego ustawienia można znaleźć na dole strony https://msdn.microsoft.com/en-us/data/jj556606 –

Powiązane problemy