ASP.NET-Identität mit EF Database First MVC5
Ist es möglich, mit der neuen Asp.net Identität mit Database First-und EDMX? Oder nur mit dem ersten code?
Hier ist, was ich getan habe:
1) ich habe eine neue MVC5-Projekt und hatte die neue Identität erstellen Sie die neue Benutzer-und Rollen-Tabellen in meiner Datenbank.
2) ich öffnete meine Datenbank Erste EDMX-Datei gezogen und in die neue Identität, die Benutzer-Tabelle, da habe ich andere Tabellen, die sich darauf beziehen.
3) Nach dem speichern der EDMX, die Datenbank Erste POCO-generator wird automatisch erstellen Sie eine Klasse Benutzer. Jedoch, UserManager und RoleManager erwartet eine User-Klasse erbt von der neuen Identität namespace (Microsoft.AspNet.Identität.IUser), ist also die POCO User-Klasse wird nicht funktionieren.
Ich denke, eine mögliche Lösung ist das Bearbeiten meiner POCO-Generation-Klassen haben meiner User-Klasse erbt von IUser?
Ist oder ASP.NET Identität nur kompatibel mit den Code-First-Design?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Update: Nach Anders Abel ' s Vorschlag unten, das ist, was ich getan habe. Es funktioniert, aber ich mich Fragen, ob es eine elegantere Lösung.
1) erweiterte ich mein entity User-Klasse durch erstellen einer partiellen Klasse im gleichen namespace wie meine automatisch generierte Entitäten.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) ich habe mein DataContext Erben von IdentityDBContext statt DBContext. Beachten Sie, dass jedes mal, wenn Sie aktualisieren Sie Ihre EDMX und regenerieren die DBContext-und Entity-Klassen, müssen Sie diese wieder auf.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) Innerhalb Ihrer auto-generierte User-entity-Klasse, müssen Sie den override-Schlüsselwort, um die folgende 4-Felder oder kommentieren Sie diese Felder aus, da Sie vererbt werden, von IdentityUser (Schritt 1). Beachten Sie, dass jedes mal, wenn Sie aktualisieren Sie Ihre EDMX und regenerieren die DBContext-und Entity-Klassen, müssen Sie diese wieder auf.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
InformationsquelleAutor der Frage Patrick Tran | 2013-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte es möglich sein, verwenden Sie den identity-system mit POCO und Datenbank-Erste, aber du musst machen Sie ein paar tweaks:
partial
. Damit wird es möglich für Sie zu liefern, zusätzliche Implementierung in einer separaten Datei.User
Klasse in einer anderen DateiMachen, dass die
User
Klasse implementieren, die richtige Schnittstelle verwendet, ohne Sie zu berühren die tatsächlich generierte Dateien (Bearbeiten der generierten Dateien ist immer eine schlechte Idee).InformationsquelleAutor der Antwort Anders Abel
Meine Schritte sind sehr ähnlich, aber ich wollte zu teilen.
1) Erstellen Sie eine neue MVC5 Projekt
2) Erstellen Sie ein neues Modell.edmx. Auch wenn es eine neue Datenbank und hat keine Tabellen.
3) Bearbeiten Sie web.config, und ersetzen Sie diese generierten connectionstring:
mit diesem connectionstring:
Danach, die Anwendung erstellen und ausführen. Registrieren Sie einen Benutzer und dann die Tabellen erstellt.
InformationsquelleAutor der Antwort JoshYates1980
EDIT: ASP.NET Identität mit EF Zunächst die Datenbank für MVC5 CodePlex-Projekt-Vorlage.
Wollte ich eine bereits vorhandene Datenbank verwenden und erstellen von Beziehungen mit ApplicationUser. Dies ist, wie ich es mit SQL-Server, aber die gleiche Idee würde wahrscheinlich funktionieren mit jedem beliebigen DB.
:base("DefaltConnection")
nutzen für Ihr Projekt die DbContext.Edit: Asp.Net Identität Klassendiagramm
InformationsquelleAutor der Antwort stink
IdentityUser
ist wertlos, weil hier die code-first-Objekt verwendet, durch dieUserStore
für die Authentifizierung. Nach der Definition meiner eigenenUser
- Objekt, implementiert habe ich eine partielle Klasse, dieIUser
die durch dieUserManager
Klasse. Ich wollte meineId
sint
anstelle von string, so dass ich einfach nur wieder die UserID toString(). Ebenso wollte ichn
imUsername
werden kleingeschriebene.Sie auf keinen Fall brauchen
IUser
. Es ist nur eine Schnittstelle verwendet, die durch dieUserManager
. Also, wenn Sie wollen, um zu definieren, eine andere "IUser" man müsste diese umschreiben Klasse Ihre eigene Implementierung.Du jetzt schreiben Sie Ihre eigenen
UserStore
behandelt alle für die Speicherung der Benutzer, Forderungen, Rollen, etc. Implementieren der Schnittstellen ist alles, der code-first -UserStore
tut und ändernwhere TUser : IdentityUser
zuwhere TUser : User
wo "User" ist die Entität, ObjektHier sind ein paar Beispiele auf einige der interface-Implementierungen
Verwendung des MVC-5-Vorlage änderte ich die
AccountController
so Aussehen.Nun einloggen sollten arbeiten mit eigenen Tabellen.
InformationsquelleAutor der Antwort Shoe
Werfen Sie einen Blick auf dieses Projekt auf GitHub: https://github.com/KriaSoft/AspNet.Identity
Umfasst:
Siehe auch: Wie erstellen Sie Datenbank-Erster Anbieter für ADO.NET Identität
InformationsquelleAutor der Antwort Konstantin Tarkus
Verbrachte ich mehrere Stunden arbeiten, durch diese und schließlich eine Lösung gefunden, die ich haben gemeinsam auf meinem blog hier. Im Grunde, Sie tun müssen, alles, was sagte in Gestank's Antwort, aber eine weitere Sache: die Sicherstellung der Identität Framework hat eine bestimmte SQL-Client-Verbindungszeichenfolge auf der Oberseite des Entity Framework Verbindungszeichenfolge für Ihre Anwendung Entitäten.
In der Zusammenfassung, Ihre Anwendung eine Verbindungszeichenfolge für die Identität Framework und anderen für Ihre Anwendung Entitäten. Jede Verbindungszeichenfolge wird von einem anderen Typ. Lesen Sie mein blog-post für eine vollständige tutorial.
InformationsquelleAutor der Antwort Daniel Eagle
Gute Frage.
Ich bin eher ein Datenbank-first-person -. Die erste code-Paradigma scheint loosey-goosey zu mir, und die "Völkerwanderung" scheinen zu fehleranfällig.
Wollte ich anpassen, das aspnet-Identität-schema, und nicht belästigt werden mit Migrationen. Ich bin versiert mit dem Visual Studio-Datenbank-Projekte (sqlpackage, Daten-dude) und wie Sie es tut einen ziemlich guten job bei der Aktualisierung von schemas.
Meine simple Lösung ist:
1) Erstellen Sie ein Datenbank-Projekt, dass Spiegel das aspnet-Identität-schema
2) verwenden Sie die Ausgabe von diesem Projekt (.dacpac) als Projekt-Ressourcen
3) bereitstellen .dacpac bei Bedarf
Für MVC5, ändern der
ApplicationDbContext
Klasse scheint das zu gehen...1) Implementieren Sie
IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext>
{
...
}
2) In Konstruktor -, signal -, die diese Klasse implementieren von Datenbank-Initialisierung:
Database.SetInitializer<ApplicationDbContext>(this);
3) Umsetzung
InitializeDatabase
:Hier bleibe ich DacFX und bereitstellen von meine .dacpac
InformationsquelleAutor der Antwort Aaron Hudon
Haben wir eine Entity-Modell-DLL-Projekt, wo wir halten unsere model-Klasse. Wir halten auch eine Datenbank-Projekt mit dem alle Datenbank-Skripte. Meine Vorgehensweise war wie folgt
1) Erstellen Sie Ihr eigenes Projekt, hat der EDMX über die Datenbank zuerst
2) Skript die Tabellen in deiner db, die ich verwendet, VS2013 verbunden localDB (Datenverbindungen) und kopiert das script zum Datenbank-Projekt, fügen Sie alle benutzerdefinierten Spalten, z.B. Geburtsdatum [DATUM] nicht null
3) eine Datenbank Bereitzustellen, die
4) Aktualisierung des Modells (EDMX) - Projekts Hinzufügen, um das Modell-Projekt
5) Fügen Sie alle benutzerdefinierten Spalten, um die application-Klasse
In der MVC-Projekt AccountController Hinzugefügt die folgenden:
Identity Provider wollen eine SQL-Verbindungszeichenfolge für Sie zu arbeiten, zu halten, nur 1 Verbindungszeichenfolge für die Datenbank, extrahieren Sie den provider-string aus der EF-Verbindungszeichenfolge
InformationsquelleAutor der Antwort Haroon
Fand ich, dass @JoshYates1980 ist die einfachste Antwort.
Nachdem eine Reihe versuche und Fehler, die ich Tat, was Josh vorgeschlagen und ersetzt die
connectionString
mit meinem generierte DB-Verbindungszeichenfolge. was war ich verwirrt darüber war ursprünglich für den folgenden Beitrag:Hinzufügen ASP.NET MVC5-Identität-Authentifizierung zu vorhandenen Datenbank
Wo ist die akzeptierte Antwort von @Win erklärte, ändern Sie die
ApplicationDbContext()
name der Verbindung. Dies ist ein wenig vage, wenn Sie mit Entity und Datenbank/Modell-first-Ansatz, wo die Datenbank-Verbindungs-Zeichenfolge wird generiert und in derWeb.config
Datei.Den
ApplicationDbContext()
name der Verbindung ist zugeordnetum die Standard-Verbindung in dieWeb.config
- Datei. Daher Josh ' s Methode funktioniert am besten, aber um dieApplicationDbContext()
mehr lesbar ist, würde ich vorschlagen den Namen zu ändern, um den Namen Ihrer Datenbank wie @Win Zitat, machen Sie sicher, dass dieconnectionString
für die "DefaultConnection" in derWeb.config
auskommentieren und/oder remov die Entität generierten Datenbank enthalten.Code-Beispiele:
InformationsquelleAutor der Antwort TheSchnitz