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.
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:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
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.
OnModelCreating()
. DbContext
meinen DbContext
mit Moq , was definitiv keine Option ist. 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:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
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. '
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 !