Die vorhandene Datenbank kann nicht in Komponententests mit dem Effort-Framework verwendet werden

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

Frage

Ich versuche, Test mit einer Datenbank zu schreiben, die in Azure SQL mit Effort Framework auf Entity Framework 6 gehostet wird.

Beim Ausführen des folgenden Codes wird eine Ausnahme ausgelöst:

[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
    EffortProviderConfiguration.RegisterProvider();
}

[TestMethod]
public void TestMethod1()
{
    const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
    IDataLoader loader = new EntityDataLoader(connectionString);
    using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
    {
        var usersCount = ctx.Users.Count();
    }
}

Ausnahme, die in der Ausführung von Count() ausgelöst wird:

Effort.Exceptions.EffortException: Nicht behandelte Ausnahme beim Versuch, den Inhalt der 'Table' Tabelle zu initialisieren ---> System.ArgumentException: Schlüsselwort nicht unterstützt: 'Datenquelle'.

Beim Ersetzen von EffortProviderConfiguration.RegisterProvider() mit app.config-Einstellungen wird die gleiche Ausnahme ausgelöst.

Wenn Sie genau die gleiche Verbindungszeichenfolge für die Erstellung von UsersDbContext es erfolgreich und die Daten sind zugänglich. Darüber hinaus funktioniert auch das Erstellen eines Kontexts mit dem permanenten oder transienten Modus "Effort" ohne Verbindungszeichenfolge.

Was sollte getan werden, um eine Verbindung mit vorhandenen Daten aus einer realen DB zu initialisieren?

Beliebte Antwort

Wenn Sie wie ich verwirrt sind, warum Sie Effort überhaupt eine Verbindungszeichenfolge geben müssen (da es sich um eine In-Memory-Datenbank handelt und Sie Ihrem Kontext direkt eine Verbindung zur Verfügung stellen), macht es die Dokumentation ein wenig klarer - das ist es Wird nur benötigt, wenn Sie zuerst die Datenbank-First- oder Model-First-Varianten des Entity Framework verwenden, da die Entity-Verbindungszeichenfolge die notwendigen Informationen zum Suchen Ihres Modells enthält, damit daraus ein Schema erstellt werden kann. So können Sie die Server / Datenbank / Benutzer-ID / Passwort Teile der Verbindungszeichenfolge mit Dummy-Namen sicher füllen.

Dies macht auch deutlich, dass der benutzerdefinierte DbConnectionFactory-Standardansatz nur für Code-First funktioniert, was die ersten paar Fehlerstunden erklärt ... Für das erste Modell oder die erste Datenbank müssen Sie eine Entity-Verbindung in Ihre Entity-Klasse einfügen , wie hier beschrieben.

Ein nützlicher Tipp: Da Ihre generierte Entity Model-Klasse eine partielle Klasse ist, können Sie eine andere Code-Datei in derselben Assembly erstellen, demselben Namespace zuweisen und sie zu einer partiellen Klasse machen und den zweiten Konstruktor hinzufügen, der zum Festlegen der EntityConnection stattdessen zu dieser Codedatei, also wenn Sie Ihr Entitätsmodell ändern / neu erstellen, wird der Code mit dem benutzerdefinierten Konstruktor nicht von der t4-Vorlage gelöscht.




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