Ich habe mit der neuen MVC 5 herumgespielt, ich habe einige Modelle, Controller und Ansichten eingerichtet, die mit Code First Migrations eingerichtet wurden.
Meine Frage ist, wie ich Benutzer und Rollen setze. Ich setze derzeit einige Referenzdaten in meine Seed-Methode in Configuration.cs. Es scheint mir jedoch, dass die Benutzer- und Rollentabellen erst erstellt werden, wenn etwas zuerst auf den AccountController trifft.
Ich habe derzeit zwei Verbindungszeichenfolgen, damit ich meine Daten von meiner Authentifizierung in verschiedene Datenbanken trennen kann.
Wie kann ich die Tabellen für Benutzer, Rollen usw. zusammen mit meinen anderen Tabellen füllen? Und nicht, wenn der Account Controller getroffen wird?
asp.net-mvc
asp.net-mvc-5
ef-migrations
seeding
MrBeanzy
quelle
quelle
Antworten:
Hier ist ein Beispiel für einen üblichen Seed-Ansatz:
Ich habe den Paketmanager "Update-Datenbank" verwendet. DB und alle Tabellen wurden erstellt und mit Daten versehen.
quelle
context.Users.Add(user);
zwischenmanager.Create(user, "ChangeItAsap!");
undmanager.AddToRole(user.Id, "AppAdmin");
. Neugeborene Benutzer haben also keine User.Id.Es ist eine kleine Ergänzung, aber für jeden, der die "Benutzer-ID nicht gefunden" hat. Nachricht beim Versuch zu säen: (Tom Regan hatte diese Frage in den Kommentaren, und ich war selbst eine Weile daran festgehalten)
Dies bedeutet, dass manager.Create (Benutzer "ChangeItAsap!") Nicht erfolgreich war. Dies mag einen anderen Grund haben, aber für mich war es, weil mein Passwort nicht erfolgreich validiert wurde.
Ich hatte einen benutzerdefinierten Passwortvalidator, der beim Seeding der Datenbank nicht aufgerufen wurde, sodass die von mir verwendeten Validierungsregeln (Mindestlänge 4 statt Standard 6) nicht zutrafen. Stellen Sie sicher, dass Ihr Passwort (und alle anderen Felder) die Validierung besteht.
quelle
IdentityResult result = manager.Create(user, "ChangeItAsap!"); if (result.Succeeded == false) { throw new Exception(result.Errors.First()); }
Dies ist meine Methode basierend auf der Valin-Antwort. Ich habe Rollen in db hinzugefügt und ein Kennwort für den Benutzer hinzugefügt. Dieser Code wird in der
Seed()
Methode unter Migrations> Configurations.cs abgelegt .quelle
Hier habe ich eine sehr einfache, saubere und reibungslose Lösung.
quelle
quelle
Task.Run(async () => { await SeedAsync(context); }).Wait();
. Sie sollten lieber schreiben,SeedAsync(context).GetAwait().GetResult();
was etwas besser ist.Sieht so aus, als hätten sie die Funktionsweise der Authentifizierung in MVC5 geändert. Meine Global.asax.cs wurde wie folgt geändert:
quelle
Schreiben Sie diesen Code in Ihre Migrationskonfiguration.
quelle