Frage

Ich versuche, meine App in einer Testumgebung bereitzustellen, kann Entity Framework jedoch nicht dazu bringen, mit der Datenbank gut zu spielen. In der Entwicklung verwende ich einen Datenbankinitialisierer, um die Datenbank zu erstellen, und das hat einwandfrei funktioniert. Wenn ich die Anwendung jedoch auf einer tatsächlichen IIS-Instanz bereitstelle, kann sie nicht mit der Datenbank verbunden werden. Meine benutzerdefinierten Initialisierungsregeln werden überhaupt nicht ausgeführt, daher erstelle ich die Datenbank manuell.

Ich habe ObjectContext.CreateDatabaseScript () als Ausgangspunkt für mein SQL-Skript verwendet, und SSMS überprüft, ob zwei Zeilen in der entsprechenden Tabelle enthalten sind.

Mein Problem tritt nach dem Ausführen der Anwendung auf. Ich habe benutzerdefinierte Mitgliedschafts- und Rollenanbieter, von denen keiner zu erkennen scheint, dass die beiden Rollen in der Datenbank vorhanden sind.

Wie kann ich feststellen, dass mein Entity-Framework erkennt, dass diese Zeilen nicht leer sind? Ich verwende derzeit einen privaten DbContext in einem Repository, um die Kommunikation mit Entity Framework zu verwalten, und habe meinen benutzerdefinierten Initialisierer deaktiviert, bis dieser Fehler behoben ist.

Code, der versucht, Rollen in der Datenbank zu finden:

context.Roles.Single(r => r.Name == role)

Die Datenbank zeigt Folgendes in der Rollentabelle an:

Id  Name     Description
1   Company  NULL
2   Customer NULL

Der LINQ generiert eine leere Sequenzausnahme als Kontext. Die Rollen sind leer.

War es hilfreich?

Lösung 2

Hier sind die Schritte, die ich durchlaufen habe, um von einem Code-First-Projekt mit einer benutzerdefinierten IDatabaseInitializer-Implementierung zu migrieren, die die Datenbank während jeder Sitzung auf ein nichtflüchtiges DB-Setup zurücksetzt.

Kopieren Sie zunächst das von Entity Framework generierte Schema in Ihren Entwickler. Projektieren Sie, indem Sie den folgenden Code ausführen und die Ausgabe an einem zugänglichen Ort ablegen (z. B. Datei auf dem Desktop, Rohtext im Browser usw.). context ist eine Instanz Ihrer Klasse, die von DbContext erbt:

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

Speichern Sie zweitens die von diesem Aufruf zurückgegebene Zeichenfolge in einer SQL-Datei. Entfernen Sie unbedingt den Befehl, mit dem die Metadatentabelle von Entity Framework erstellt wird. Dieser Befehl sollte wie folgt aussehen:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);

Entfernen Sie als Nächstes den Code, der die Datenbank erstellt. Ich habe eine AppSetting verwendet, damit ich die Verwendung dieses Codes nach der Bereitstellung leicht umschalten kann, ohne sie neu kompilieren und bereitstellen zu müssen.

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}

Unmittelbar außerhalb dieser Anweisung müssen Sie die Datenbank noch initialisieren, aber stellen Sie sicher, dass Sie false übergeben, damit die Initialisierung nur erfolgt, wenn die Datenbank nicht initialisiert wurde.

new MyContext().Database.Initialize(false);

Führen Sie abschließend Ihre Setup-SQL in einer leeren Datenbank aus, damit die Tabellen mit den entsprechenden Feldern erstellt werden.

Wenn Sie Ihre Anwendung bereitstellen und dann ausführen, sollte sie eine Verbindung zur Datenbank herstellen und mit allen Daten, die Sie in ein externes Skript geladen haben, wie gewohnt arbeiten können. Ich habe diese Methode erfolgreich mit benutzerdefinierten Mitgliedschafts- und Rollenanbietern getestet.

Andere Tipps

Den Kommentaren nach zu urteilen, scheint es keine Verbindung zwischen Entity Framework und der Datenbank zu geben.Sie erwähnen nicht, welche Version von Entity Framework Sie verwenden, aber ich gehe davon aus, dass Sie auf den neuesten Stand gebracht haben (4.3 zum Zeitpunkt des Schreibens).

Ich stelle fest, dass Sie sagen, dass Sie "die Datenbank manuell erstellen".Öffnen Sie ein Testprojekt und erstellen Sie ein neues erstes Datenbankmodell basierend auf Ihrer manuell erstellten Datenbank.Dies sollte zumindest bestätigen, dass Sie Entity Framework mit Ihrer Konfiguration verwenden können. Von dort aus würde ich ein weiteres Projekt von Grund auf neu erstellen, um den Code First-Ansatz zu testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top