it-swarm.com.de

Woher weiß eine neue ASP.NET MVC 5-Anwendung, wie eine Datenbank erstellt wird, und wie greift der Account Controller auf die Datenbank zu?

Ich habe eine ASP.NET MVC 5 -Anwendung mit Visual Studio 2013 Update 2. In der Anwendung habe ich einen Account Controller. Es unterscheidet sich von dem, was ich gewohnt bin, und enthält keine Instanziierung von dbcontext ​​.

public class AccountController : Controller
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

Mein web.config, das standardmäßig erstellt wird, hat eine Verbindungszeichenfolge wie die folgende:

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf;Initial Catalog=aspnet-WebApplication3-20140417072624;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

Kann mir jemand erklären, wie die Anwendung beim ersten Start eine Datenbank für diese Anwendung erstellen kann?

Wird beim nächsten Start Entity Framework verwendet, um auf die Identitätstabellen zuzugreifen und die Authentifizierung durchzuführen?

34
user1943020

1) WAS PASSIERT HIER:

Wenn Sie eine neue MVC 5 -Anwendung erstellen und " Individual User" auswählen Accounts ", ein neuer ASP.NET Identity Provider , der verwendet Entity Framework 6 Code-First .

Microsoft hat EF-Code-First übernommen, um die Identität so anpassbar wie möglich zu machen.

Wenn zum ersten Mal auf Identity zugegriffen wird, prüft Entity Framework , ob die Datenbank vorhanden ist. Sofern nicht anders konfiguriert, wird die Identitätsdatenbank mit "DefaultConnection" Ermittelt. Wenn die Datenbank beim Aufrufen von Identity nicht vorhanden ist, hat [~ # ~] ef [~ # ~] die Datenbank automatisch erstellt.

Beachten Sie, dass Ihre Verbindungszeichenfolge enthält

`AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf`

Wenn Sie Ihren Ordner App_Data öffnen, sollten Sie einen aspnet- Datei WebApplication3-20140417072624.mdf .

Wenn Sie auf diese . Mdf Datei doppelklicken, wird der VS2013 Server Explorer öffnet Ihre DB. Wenn Sie bereits versucht haben, auf Identitätsfunktionen zuzugreifen, werden die folgenden Tabellen erstellt:

  • _ MigrationHistory
  • ASPNetRoles
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASPNetUsers

Standardmäßig ist Ihre App für die Verwendung von SQL Server Compact (MDF-Datei) konfiguriert. Es muss keine aktuelle SQL Server -Instanz ausgeführt werden. All dies ist anpassbar. Der Name Ihrer MDF Datei, das Schema der Identitätsdatenbank, die Auswahl von SQL Compact gegen eine tatsächliche SQL Server-Instanz Ändern Sie Ihre Verbindungszeichenfolge, oder erstelle eine neue und übergebe diese neue Verbindung an deinen Kontext.


2) WO IS MEIN KONTEXT?

All dies ist gut und schön, aber eine wichtige Frage, die Sie gestellt haben, ist im Grunde " Wo ist mein Kontext? " und die ebenso relevanten impliziten Fragen, wie Sie können Ihre Datenbank weiter anpassen oder die Validierungslogik ändern.

Sie werden feststellen, dass Ihr Projekt auf Microsoft.AspNet.Identity.EntityFramework Verweist. Diese Assembly ist eine Implementierung von IdentityDBContext<TUser> Und die Implementierung der Klasse UserManager.

Öffnen Sie Ihren AccountController , und beachten Sie, dass der Konstruktor das Objekt UserManager übergeben hat, das der Reihe nach übergeben wurde hat ein new UserStore Objekt übergeben, das ein ApplicationDbContext übergeben bekommt.

    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

Das ApplicationDbContext ist in Ihrem Models Ordner definiert. In diesem Ordner finden Sie eine IdentityModels.cs -Datei. Öffnen Sie es und Sie werden sehen

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

Hier wird Ihr Identitätskontext zugewiesen. Sie können den an den Konstruktor ApplicationDbContext übergebenen Verbindungsnamen ändern oder einen anderen Kontext in Ihrem Kontocontroller definieren und verwenden.


3) WIE Passe ICH MEIN IDENTITÄTSPLAN AN?

Eine andere Klasse, die in IdentityModels.cs definiert ist, ist die Klasse ApplicationUser, von der erbt IdentityUser Klasse.

public class ApplicationUser : IdentityUser
{
}

Alle Eigenschaften, die Sie dieser Klasse hinzufügen, bleiben in Ihrer ASPNetUsers -Tabelle erhalten. Der Rest des Schemas wird in der Klasse IdentityDbContext definiert. Während Sie also Ihrem Identitätsschema weitere Tabellen (z. B. Berechtigungen) hinzufügen können, indem Sie der Kontextdefinition ein DBSet hinzufügen,

public DBSet<Privileges> { get; set; }

Das Ändern anderer Tabellen (Rollen, Ansprüche usw.) ist ebenfalls möglich, jedoch weitaus umfangreicher. Um beispielsweise die Tabelle Roles anzupassen, müssten Sie ein NewIdentityRole implementieren, das von IdentityRole erbt, und es hinzufügen Beziehung durch Überschreiben der OnModelCreating() -Methode für Ihren Kontext.

In diesem Artikel zu Anpassen von Rollentabellen werden die erforderlichen Schritte gut beschrieben. Sogar hier werden Sie feststellen, dass es erhebliche Probleme gibt, einfach neue Spalten hinzuzufügen. Das Entfernen von Tabellen oder Spalten aus dem ursprünglichen Schema, das in der Klasse IdentityDbContext erstellt wurde, ist wahrscheinlich genauso problematisch wie das Erstellen einer eigenen Implementierung der Klasse IdentityDbContext.

78
Dave Alperovich

Wie Melina betonte, bezog sich die ursprüngliche Frage auf das aktuelle ASP.NET Identity 2.x-Modell.

Die Antwort von Dave Alperovich lieferte wertvolle Hintergrundinformationen zu den Konzepten hinter ASP.NET Identity, obwohl die Beispiele aus ASP.NET Identity 1.x stammen, das 2014 ersetzt wurde.

Callum Linington gibt die Antwort "Einem Mann das Fischen beibringen". Wenn Sie seinem Rat folgen, können Sie leicht erkennen, dass die 2.x-Klasse "ApplicationUserManager" von einem "UserManager" im 1.x-Stil abgeleitet ist.

Die Antwort ist im Grunde, dass der "ApplicationUserManager", der beim Erstellen von "AccountController" als Parameter eingefügt wird, in einem eigenen Konstruktor eine Verbindung zum Identitätsdatenspeicher herstellt:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

Beachten Sie, dass dieser "versteckte" 2.x-Code dem oben angegebenen 1.x-Code sehr ähnlich ist:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
0
Scott Taylor

Sicherlich wäre es in der ApplicationUserManager, ich vermute, dass dies ein Dienst ist, der den DB-Kontext verwendet, um die Anwendungsbenutzer zu verwalten.

Sie können mit der rechten Maustaste auf diese Klasse klicken und auf Go to definition und machen Sie so lange weiter, bis Sie die Klasse sehen, die die Datenbank initialisiert.

In MVC 4 erfolgt die Initialisierung auch in einem Filterattribut. Schauen Sie also in den Filter-Ordner, wenn es einen gibt. Ich weiß, dass es nicht MVC 5 ist. Aber es könnte trotzdem anwendbar sein.

0