wake-up-neo.com

EF 4.1 Code First und bestehende Datenbank- und .NET-Mitgliedschaft

Ich habe eine Datenbank mit dem Namen ApplicationName_Development, die unter SQL Server 2008 R2 Developer Edition in meinem Entwicklungspaket ausgeführt wird.

Ich habe der Datenbank problemlos .NET-Mitgliedschaftstabellen hinzugefügt. Als ich versuchte, Code First zum Laufen zu bringen, wurde folgende Fehlermeldung angezeigt:

Beim Verarbeiten der Anforderung ist auf dem Server ein Fehler aufgetreten. Die Ausnahmemeldung lautet "Die Modellkompatibilität kann nicht überprüft werden, da die Datenbank keine Modellmetadaten enthält. Stellen Sie sicher, dass IncludeMetadataConvention zu den DbModelBuilder-Konventionen hinzugefügt wurde.

Nach einigem googeln stellte ich fest, dass ich die Datenbank löschen und EF die Datenbank erstellen lassen musste. Das ist in Ordnung, aber ich habe alle meine .NET-Mitgliedschaftstabellen verloren. Ich kann zurückgehen und die Mitgliedschaftstabellen erneut hinzufügen, aber wenn sich mein Modell ändert und EF die Datenbank neu erstellen muss, muss ich die Mitgliedschaftstabellen erneut hinzufügen.

Wie komme ich darum herum?

15
Mike

Hier wurde eine einfachere Problemumgehung gefunden. Ich hoffe das hilft.

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

5
cbrcoder

So funktioniert Code-First. Die Hauptidee des Codes ist, dass Sie Ihre Datenbank nicht berühren, da das Modell für die Erstellung der Datenbank verantwortlich ist. Wenn Sie Ihre Datenbank anpassen möchten, müssen Sie eine benutzerdefinierte IDatabaseInitializer erstellen und Ihre benutzerdefinierte SQL hinzufügen.

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Here run your custom SQL commands
        context.Database.ExecuteSqlCommand("CREATE TABLE ....");
    }
}

Jetzt müssen Sie Ihren cutom-Intializer nur noch beim Start Ihrer Anwendung einrichten:

Database.SetInitializer<MyContext>(new MyDbInitializer());

Wenn Sie dies nicht auf diese Weise tun möchten, müssen Sie Ihre Datenbank manuell verwalten und den Initialisierer auf Null setzen.

6
Ladislav Mrnka

Eine weitere Option könnte die Verwendung des Namespace System.Web.Management sein. Ich hatte großen Erfolg mit dem folgenden Code:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);

Es wird nur die Datenbank erstellt und danach können Sie Benutzer mit der Standard-Mitgliedschafts-API hinzufügen.

5
wullinkm

Hier ist eine andere Möglichkeit.

Wenn Sie sich das MvcMusicStore-Beispiel ansehen, gibt es eine SampleData-Klasse, die für das Seeding der Datenbank bei einer Neuerstellung verantwortlich ist. Die Klasse SampleData erbt von DropCreateDatabaseIfModelChanges und überschreibt die Methode Seed. Diese Klasse wird an den Database.SetInitializer in der Application_Start-Methode in global.asax übergeben.

Ich habe den gleichen Fehler wie Sie erhalten, bis ich die übergeordnete Klasse von SampleData in CreateDatabaseIfNotExist geändert habe.

Anschließend können Sie die Methode Seed überschreiben, um beim Start alle gewünschten Daten einzufügen, ohne die Datenbank zu zerstören.

3
Phil

Erstellen Sie während der Entwicklung zwei Datenbanken und zwei Verbindungszeichenfolgen. Eine für SqlMembership (mit aspnet_regsql) und eine für Ihre EF-Anwendung. Wenn Sie sie in der Produktion zu einer einzigen Datenbank zusammenführen möchten, ändern Sie einfach die Verbindungszeichenfolge in web.config.release so, dass sie identisch ist. In diesem Fall werden bei Änderungen des EF-Modells nur Ihre Apps-Datenbank und nicht Ihre Mitgliedschafts-Datenbank gelöscht.

Indem Sie Ihre Authentifizierungskomponente separat behandeln, entkoppeln Sie Ihr Authentifizierungssystem auf natürliche Weise von Ihrem Anwendungssystem. Wenn Sie dann den Mitgliedschaftsanbieter wechseln möchten, sind Sie besser aufgestellt.

Wenn das System wächst, müssen Sie wahrscheinlich zuerst nicht-reine Modelle ohne EF-Code unterstützen. Dies ist also eine gute Vorlage, um diesen Weg zu beschreiten.

2
Doug

Ich fand den einfachsten Weg, ohne mit irgendetwas anderem zu spielen, den folgenden.

Ich habe die Anwendung zum ersten Mal mit DropAndRecreatedatabase ausgeführt, immer in der Initilizer.

Dies hat meine Datenbank zum ersten Mal erstellt.

Im Anschluss daran habe ich dies zu DropCreateDatabaseIfModelChanges geändert.

0
Dee