UnintentionalCodeFirstException | Entity Framework Unit Testing mit Aufwand.Ef6 mit Datenbank zuerst

c# effort entity-framework entity-framework-6 unit-testing

Frage

Die Situation

Ich möchte Einheitentests meines DbContext basierend auf Entitätsframework DbContext 6. Ich habe meinen DbContext und meine Modelle mit dem ersten Ansatz der Datenbank erstellt und habe nun eine .edmx- Designerdatei.

Das Problem

Mein automatisch erstellter DbContext überschreibt die DbContext.OnModelCreating Methode wie DbContext.OnModelCreating :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Ich versuche, eine neue Instanz meines DbContext in meinem verspotteten Datenzugriffsdienst basierend auf den Informationen dieses Artikels zu erstellen. Mein Code läuft nicht in Database.SetInitializer; wie der Autor dieses Blogposts darauf hingewiesen hat. Mein Konstruktor sieht genau so aus wie er. Meine DbContext Initialisierung sieht folgendermaßen aus:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

OnModelCreating führt zu folgender Ausnahme beim Erreichen des zuvor erwähnten überschriebenen OnModelCreating

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'Der Kontext wird im Code-First-Modus mit Code verwendet, der aus einer EDMX-Datei entweder für die Database First- oder die Model First-Entwicklung generiert wurde. Dies wird nicht korrekt funktionieren. Entfernen Sie die Codezeile nicht, die diese Ausnahme auslöst, um dieses Problem zu beheben. Wenn Sie Database First oder Model First verwenden möchten, stellen Sie sicher, dass die Entity Framework-Verbindungszeichenfolge in der Datei app.config oder web.config des Startprojekts enthalten ist. Wenn Sie Ihre eigene DbConnection erstellen, stellen Sie sicher, dass es sich um eine EntityConnection und nicht um eine andere Art von DbConnection handelt, und dass Sie sie an einen der DbContext-Basiskonstruktoren übergeben, die eine DbConnection verwenden. Weitere Informationen zu Code First, Database First und Model First finden Sie in der Entity Framework-Dokumentation unter http://go.microsoft.com/fwlink/?LinkId=394715 ( möglicherweise in englischer Sprache ).

Es gibt viele Fragen zu stackoverflow, die sich auf Komponententests mit Aufwand konzentrieren, während die Datenbank zuerst verwendet wird, aber niemand scheint ähnliche Probleme wie ich zu haben.

Was ich schon versucht habe zu tun

  • Lange im Internet nach einer Lösung suchen.
  • Kommentar zu dem überschriebenen OnModelCreating() .
  • Ich habe bereits versucht, diese Lösung ohne Erfolg anzuwenden.
  • DbContext meinen DbContext mit Moq , was definitiv keine Option ist.

Die Frage

Wie kann ich eine In-Memory-Datenbank (mit Aufwand) erstellen und verwenden?


Zusätzliche Information

Wenn ich OnModelCreating() , wird beim ersten Zugriff auf den OnModelCreating() eine Ausnahme ausgelöst. Z.B:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

System.Data.Entity.ModelConfiguration.ModelValidationException: 'Bei der Modellerstellung wurden ein oder mehrere Validierungsfehler festgestellt: MyApplication.Shared.Model.KeyValuePair:: EntityType' KeyValuePair 'hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType. KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' basiert auf dem Typ 'KeyValuePair', der keine Schlüssel definiert hat. '

Akzeptierte Antwort

Das Problem war, dass ich den Schlüssel für meinen KeyValuePair-Datensatz angeben musste.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

Vielen Dank Robert Jörgensgaard Engdahl !




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum