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?
Wenn Sie wie ich verwirrt sind, warum Sie Effort überhaupt eine Verbindungszeichenfolge zuweisen müssen (da dies aus einer speicherinternen Datenbank heraus funktioniert und Sie Ihrem Kontext direkt eine Verbindung bereitstellen), ist dies in der Dokumentation etwas klarer Nur erforderlich, wenn Sie Datenbank- oder Modell-Erstvarianten von Entity Framework verwenden, da die Entity-Verbindungszeichenfolge die Informationen enthält, die Effort benötigt, um Ihr Modell zu lokalisieren, damit es daraus ein Schema erstellen kann. So können Sie die Bereiche Server / Datenbank / Benutzer-ID / Kennwort der Verbindungszeichenfolge sicher mit Dummy-Namen füllen.
Dies macht auch deutlich, dass der benutzerdefinierte Standardansatz von DbConnectionFactory nur für Code-first funktioniert. Dies erklärt die ersten Stunden der Fehler, die ich erhalten habe ... Für zuerst das Modell oder die Datenbank müssen Sie eine Entitätsverbindung in Ihre Entitätsklasse einfügen , wie hier beschrieben.
Ein nützlicher Tipp: Da es sich bei Ihrer generierten Entitätsmodellklasse um eine Teilklasse handelt, können Sie eine weitere Codedatei in derselben Assembly erstellen, ihr denselben Namespace zuweisen und sie auch zu einer Teilklasse machen. Außerdem können Sie den zweiten Konstruktor hinzufügen, der zum Festlegen der Klasse erforderlich ist EntityConnection mit dieser Codedatei stattdessen wird der Code mit dem benutzerdefinierten Konstruktor von der t4-Vorlage nicht gelöscht, wenn Sie Ihr Entitätsmodell ändern / neu erstellen.