web-dev-qa-db-fra.com

Comment une nouvelle application ASP.NET MVC 5 sait-elle comment créer une base de données et comment le contrôleur de compte accède-t-il à la base de données?

J'ai créé une application ASP.NET MVC 5 utilisant Visual Studio 2013 Update 2 . Dans l'application, j'ai un contrôleur de compte. C'est différent de ce à quoi je suis habitué et ne contient pas une instanciation de 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;
        }
    }

Ma web.config qui est créé par défaut a une chaîne de connexion comme celle-ci:

  <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>

Quelqu'un peut-il m'expliquer comment l'application sait créer une base de données pour cette application lorsqu'elle démarre pour la première fois?

De plus, lors des démarrages suivants, utilise-t-il Entity Framework pour accéder aux tables d'identité pour effectuer l'authentification?

34
user1943020

1) CE QUI SE PASSE ICI:

Lorsque vous créez une nouvelle application MVC 5 et choisissez " Comptes d'utilisateurs individuels ", un nouveau Fournisseur d'identité ASP.NET est inclus et utilise = Entity Framework 6 Code-First.

Microsoft a adopté EF-Code-First pour rendre Identité aussi personnalisable que possible.

Lorsque vous accédez à Identity pour la première fois, Entity Framework vérifie si la base de données existe. Sauf configuration contraire, il utilise le "DefaultConnection" Pour trouver la base de données d'identité. Si la base de données n'existe pas lors de l'appel de l'identité, [~ # ~] ef [~ # ~] a automatiquement créé la base de données.

Notez que votre chaîne de connexion contient

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

Si vous ouvrez votre App_Data dossier, vous devriez avoir un aspnet-WebApplication3-20140417072624.mdf fichier.

Si vous double-cliquez sur ce fichier . Mdf , le VS2013 Server Explorer ouvrira votre base de données. Si vous avez déjà tenté d'accéder à une fonctionnalité d'identité, ces tables seront créées:

  • _ MigrationHistory
  • ASPNetRoles
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASPNetUsers

Par défaut, votre application est configurée pour utiliser SQL Server Compact (fichier MDF) afin que vous n'ayez pas à avoir une instance réelle SQL Server Instance en cours d'exécution. Tout cela est personnalisable. Le nom de votre fichier MDF, le schéma de la base de données d'identité, le choix de SQL Compact vs une instance réelle SQL Server. Modifiez votre chaîne de connexion ou créez-en une nouvelle et transmettez cette nouvelle connexion à votre contexte.


2) OERE IS MON CONTEXTE?

Tout cela est bien beau, mais une question importante que vous avez posée est essentiellement " Où est mon contexte? ", et les questions implicites tout aussi pertinentes concernant la façon dont vous pouvez personnaliser davantage votre base de données ou modifier la logique de validation.

Vous remarquerez que votre projet fait référence à Microsoft.AspNet.Identity.EntityFramework. Cet assemblage est une implémentation de IdentityDBContext<TUser> Et une implentation de la classe UserManager.

Ouvrez votre AccountController, et remarquez que le constructeur a UserManager objet passé qui à son tour a un new UserStore Objet passé, qui reçoit un ApplicationDbContext.

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

Le ApplicationDbContext est défini dans votre dossier Modèles . À l'intérieur de ce dossier, vous trouverez un fichier IdentityModels.cs. Ouvrez-le et vous verrez

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

C'est là que votre contexte d'identité est attribué. vous pouvez modifier le nom de connexion transmis au constructeur ApplicationDbContext ou définir et utiliser un contexte différent dans votre contrôleur de compte.


3) COMMENT PERSONNALISER MON SCHÉMA D'IDENTITÉ?

Une autre classe définie IN IdentityModels.cs est la classe ApplicationUser qui hérite de IdentityUser classe.

public class ApplicationUser : IdentityUser
{
}

Toutes les propriétés que vous ajoutez à cette classe seront conservées dans votre ASPNetUsers table. Le reste du schéma est défini dans la classe IdentityDbContext. Ainsi, bien que vous puissiez ajouter plus de tables (par exemple, des privilèges) à votre schéma d'identité en ajoutant un DBSet à la définition de contexte,

public DBSet<Privileges> { get; set; }

La modification d'autres tables (rôles, revendications, etc.) est également possible, mais beaucoup plus complexe. Par exemple, pour personnaliser la table des rôles , vous devez implémenter un NewIdentityRole héritant de IdentityRole et l'ajouter en remplaçant la méthode OnModelCreating() pour votre contexte.

Cet article sur Personnalisation des tables de rôles fait un bon travail de description des étapes impliquées. Même ici, vous constaterez qu'il y a beaucoup de mal à investir simplement dans l'ajout de nouvelles colonnes. La suppression de tables ou de colonnes du schéma d'origine créé dans la classe IdentityDbContext est probablement aussi difficile que de créer votre propre implémentation de la classe IdentityDbContext.

78
Dave Alperovich

Comme l'a souligné Melina, la question d'origine faisait référence au modèle ASP.NET Identity 2.x actuel.

La réponse de Dave Alperovich a fourni de précieuses informations de base sur les concepts derrière ASP.NET Identity, bien que les exemples aient été tirés d'ASP.NET Identity 1.x, qui a été remplacé en 2014.

Callum Linington fournit la réponse "apprendre à l'homme à pêcher". En suivant ses conseils, il est facile de voir que la classe 2.x "ApplicationUserManager" est dérivée d'un "UserManager" de style 1.x.

La réponse est essentiellement que le "ApplicationUserManager", qui est injecté en tant que paramètre lorsque "AccountController" est créé, se connecte au magasin de données d'identité dans son propre constructeur:

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

Notez comment ce code 2.x "caché" est très similaire au code 1.x comme indiqué ci-dessus:

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

Ce serait sûrement dans le ApplicationUserManager, je suppose que c'est un service qui utilise le contexte db pour gérer les utilisateurs de l'application.

Vous pouvez cliquer avec le bouton droit sur cette classe et cliquer sur Go to definition et continuez jusqu'à ce que vous voyiez la classe qui initialise la base de données.

De plus, dans MVC 4, l'initialisation se fait dans un attribut de filtre. Regardez donc dans le dossier Filter s'il y en a un. Je sais que ce n'est pas MVC 5. Mais cela pourrait quand même s'appliquer.

0
Callum Linington