2013-03-26 1 views
7

Ich habe eine Anwendung, die zwei separate Modelle in einer einzigen Datenbank gespeichert verwendet. Das erste Modell ist mit Migrationen eingerichtet und erstellt die Migrationsdaten in der Datenbank. Das zweite ist ein sehr einfaches Modell, das überhaupt keine Modellvalidierung benötigt - die Tabellen, die es verwendet, existieren und haben die richtige Struktur. Der zweite Kontext funktioniert in einer separaten Datenbank mit derselben Tabellenstruktur.Kann DbContext Migrations-/Versionsdaten in der Datenbank ignorieren?

Das Problem ist, es schlägt fehl, wenn in der gleichen Datenbank mit dem ersten Modell ausgeführt wird, da es eine Art von Modellüberprüfung bietet. Es beschwert sich, dass der Kontext seit der letzten Aktualisierung geändert wurde, aber die Migrationsdaten enthalten natürlich nichts über die Tabellen des zweiten Kontexts.

Ist es möglich, die Metadaten-Validierung für den Kontext zu deaktivieren, und lassen Sie einfach den zweiten Kontext gegen die Tabellen arbeiten, wie es ist, da ich weiß, dass das funktioniert?

im Context-Konstruktor, aber das hat keine Auswirkungen.

+0

Ich glaube, ich verstehe, was Sie zu tun versuchen. Verwenden Sie überhaupt einen DBInitializer? – timothyclifford

+0

Configuration.AutoDetectChangesEnabled = false; Deaktiviert die Änderungsverfolgung für die Entitäten, die manchmal aus Leistungsgründen benötigt wird. Siehe http://blog.oneunicorn.com/2012/03/11/secrets-of-detectchanges-part-2-when--detectchange-automatisch/. –

Antwort

10

Die Lösung besteht darin, einen "do nothing" -Datenbankinitialisierer zu implementieren, der grundsätzlich nichts tut.

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

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

Um in einer Zeit Startup-Code zu verwenden, dann:

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

Einfach, aber nicht offensichtliche Lösung.

Edit:

Auch einfachere Lösung: einfach NULL übergeben an die SetInitializer() -Methode:

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

Verdammt schlag mich dazu :) netter! – timothyclifford

+1

Die "noch einfachere Lösung" funktionierte für mich. – Andy

+0

Wenn Sie feststellen, dass dies nicht wie erwartet funktioniert, überprüfen Sie den EF-Abschnitt Ihrer Konfigurationsdatei. Stellen Sie sicher, dass Ihr Kontext disableDatabaseInitialization = "true" hat. Ich habe dazu viel zu viele Stunden verloren und niemand erwähnt sie in ihren Antworten hier. Weitere Informationen zu dieser Einstellung finden Sie am Ende von https://msdn.microsoft.com/en-us/data/jj556606 –