Eine Standard-MVC 5-App enthält diesen Code in IdentityModels.cs. Dieser Code gilt für alle ASP.NET-Identitätsvorgänge für die Standardvorlagen:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Wenn ich einen neuen Controller mithilfe von Ansichten mit Entity Framework auf ein Gerüst stelle und im Dialogfeld einen "neuen Datenkontext ..." erstelle, wird dies für mich generiert:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
}
}
Wenn ich einen anderen Controller + eine andere Ansicht mit EF erstellen würde, beispielsweise für ein Tiermodell, würde diese neue Zeile direkt unter public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- wie folgt - automatisch generiert :
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }
}
}
ApplicationDbContext
(für alle ASP.NET Identity-Inhalte) erbt, von IdentityDbContext
denen wiederum erbt DbContext
.
AllOtherStuffDbContext
(für meine eigenen Sachen) erbt von DbContext
.
Meine Frage lautet also:
Welches dieser beiden ( ApplicationDbContext
und AllOtherStuffDbContext
) sollte ich für alle meine anderen Modelle verwenden? Oder sollte ich einfach die standardmäßige automatische Generierung verwenden, ApplicationDbContext
da dies kein Problem darstellen sollte, da sie von der Basisklasse stammt DbContext
, oder wird es einen gewissen Overhead geben? Sie sollten nur ein DbContext
Objekt in Ihrer App für alle Ihre Modelle verwenden (ich habe dies irgendwo gelesen), damit ich nicht einmal in Betracht ziehen sollte, beide ApplicationDbContext
und AllOtherStuffDbContext
in einer einzigen App zu verwenden? Oder was ist die beste Vorgehensweise in MVC 5 mit ASP.NET Identity?
quelle
Antworten:
Ich würde eine einzelne Context-Klasse verwenden, die von IdentityDbContext erbt. Auf diese Weise kann der Kontext alle Beziehungen zwischen Ihren Klassen und dem IdentityUser und den Rollen des IdentityDbContext berücksichtigen. Der IdentityDbContext ist sehr wenig aufwendig, es handelt sich im Grunde genommen um einen regulären DbContext mit zwei DbSets. Eine für die Benutzer und eine für die Rollen.
quelle
Es gibt viel Verwirrung über IdentityDbContext , eine schnelle Suche in Stackoverflow, und Sie werden folgende Fragen finden:
" Warum ist Asp.Net Identity IdentityDbContext eine Black-Box?
Wie kann ich die Tabellennamen ändern, wenn ich Visual Studio 2013 AspNet Identity verwende?
MyDbContext mit IdentityDbContext zusammenführen "
Um all diese Fragen zu beantworten, müssen wir verstehen, dass IdentityDbContext nur eine von DbContext geerbte Klasse ist.
Werfen wir einen Blick auf die IdentityDbContext-Quelle :
Basierend auf dem Quellcode haben wir zwei Optionen, wenn wir IdentityDbContext mit unserem DbContext zusammenführen möchten:
Erste Option:
Erstellen Sie einen DbContext, der von IdentityDbContext erbt und Zugriff auf die Klassen hat.
Zusätzliche Hinweise:
1) Wir können auch die Standardtabellennamen der asp.net-Identität mit der folgenden Lösung ändern:
2) Außerdem können wir jede Klasse erweitern und Klassen wie 'IdentityUser', 'IdentityRole', ... eine beliebige Eigenschaft hinzufügen.
Um Zeit zu sparen, können wir die erweiterbare Projektvorlage AspNet Identity 2.0 verwenden , um alle Klassen zu erweitern.
Zweite Option:(Nicht empfohlen)
Wir müssen eigentlich nicht von IdentityDbContext erben, wenn wir den gesamten Code selbst schreiben.
Grundsätzlich können wir also einfach von DbContext erben und unsere angepasste Version von "OnModelCreating (ModelBuilder Builder)" aus dem IdentityDbContext-Quellcode implementieren
quelle
Dies ist ein später Eintrag für Leute, aber unten ist meine Implementierung. Sie werden auch feststellen, dass ich die Möglichkeit, den Standardtyp KEYs zu ändern, deaktiviert habe: Die Details dazu finden Sie in den folgenden Artikeln:
HINWEISE:
Es ist zu beachten, dass Sie diese nicht
Guid's
für Ihre Schlüssel verwenden können. Dies liegt daran, dass sie unter der Haube a sindStruct
und als solche kein Unboxing haben, das ihre Konvertierung von einem generischen<TKey>
Parameter ermöglichen würde.Die Klassen sehen aus wie:
quelle
Wenn Sie die Abstraktionen des IdentityDbContext durchgehen, werden Sie feststellen, dass er genauso aussieht wie Ihr abgeleiteter DbContext. Der einfachste Weg ist Olavs Antwort. Wenn Sie jedoch mehr Kontrolle darüber haben möchten, was erstellt wird, und etwas weniger Abhängigkeit von den Identitätspaketen , schauen Sie sich meine Frage und Antwort hier an . Es gibt ein Codebeispiel, wenn Sie dem Link folgen, aber zusammenfassend fügen Sie einfach die erforderlichen DbSets zu Ihrer eigenen DbContext-Unterklasse hinzu.
quelle