IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Personnalisation de Register


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 167
    Points : 109
    Points
    109
    Par défaut Personnalisation de Register
    Bonjour,

    Je tente de personnaliser le formulaire d'inscription par défaut de Identity.
    Je n'arrive pas à réaliser une migration.

    Le modèle "ApplicationUser" avec les colonnes à ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    using Microsoft.AspNetCore.Identity;
    using System.ComponentModel.DataAnnotations.Schema;
     
    namespace LeC_MVC_Auth_2024.Models
    {
        [Table("AspNetUsers")]
        public class ApplicationUser : IdentityUser
        {
            public string Civilite { get; set; }
            public string Prenom { get; set; }
            public string AdresseSiege { get; set; }
            public string ZipCode { get; set; }
            public string Ville { get; set; }
            public string Pays { get; set; }
            public string Societe { get; set; }
            public string CodeIdentSociete { get; set; }
            public string? AdressesEnlevement { get; set; } 
            public int? RayonLivraison { get; set; }
            [Column(TypeName = "decimal(6,2)")]
            public decimal? RayonTarif { get; set; }
            public int? RayonDelai { get; set; }
        }
    }
    Le contexte modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore;
     
    namespace LeC_MVC_Auth_2024.Data
    {
        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options)
            {
            }
            protected override void OnModelCreating(ModelBuilder builder)
            {
                base.OnModelCreating(builder);
            }
        }
    }
    Mais le résultat de la migration est vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    using Microsoft.EntityFrameworkCore.Migrations;
     
    #nullable disable
     
    namespace LeC_MVC_Auth_2024.Migrations.ApplicationDb
    {
        public partial class Custom2 : Migration
        {
            protected override void Up(MigrationBuilder migrationBuilder)
            {
     
            }
     
            protected override void Down(MigrationBuilder migrationBuilder)
            {
     
            }
        }
    }
    J'ai régénéré la solution. Redémarré VS. Rien n'y fait.
    J'ai obtenu une fois un résultat. À ma grande surprise. Sans rien changer, à part le nom de la migration.
    Mais le résultat consistait à créer une table "AspNetUsers" (donc déjà existante) AVEC en plus les nouvelles colonnes persos.
    Update-database a évidemment échoué.

    Note : À chaque essai je supprime le fichier de la migration précédente (non appliquée à la BdD).
    J'ai l'impression de ne pas comprendre comment sont conservées en mémoire, ou dans un fichier caché, mes diverses tentatives.
    Et que c'est cela qui rend le truc bancale.
    Merci !

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 790
    Points : 5 574
    Points
    5 574
    Par défaut
    Un Update-Database sans rien à migrer ne fait rien.
    A chaque modification de ton modèle, il faut utiliser Add-Migration.

    https://learn.microsoft.com/en-us/ef...tions/?tabs=vs

  3. #3
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 167
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par popo Voir le message
    Un Update-Database sans rien à migrer ne fait rien.
    A chaque modification de ton modèle, il faut utiliser Add-Migration.
    Bonjour,
    Oui, c'est bien ce que je fais... et qui ne fonctionne pas.
    Je créé des migrations mais elles sont toutes vides.
    Alors que j'ai une dizaine de colonnes à ajouter, comme indiqué dans "ApplicationUser".
    Je ne peux donc pas updater ma base de données.

  4. #4
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 167
    Points : 109
    Points
    109
    Par défaut
    Aujour'hui j'ai modifié la classe "ApplicationUser" pour ajouter des options "nullable" à certaines colonnes.

    Puis, j'ai modifié le contexte "ApplicationDbContext.cs" de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    namespace LeC_MVC_Auth_2024.Data
    {
        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options)
            {
            }
            protected override void OnModelCreating(ModelBuilder builder)
            {
               base.OnModelCreating(builder);
            }
        }
    }
    Que j'avais directement pris chez Microsoft "Identity model customization"
    https://learn.microsoft.com/en-us/as...aspnetcore-8.0

    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    namespace LeC_MVC_Auth_2024.Data
    {
        public class ApplicationDbContext : IdentityDbContext
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options)
            {
            }
            public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        }
    }
    Vu sur Youtube

    Avec "ApplicationUser" égal à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        public class ApplicationUser : IdentityUser
        {
            public string Civilite { get; set; }
            public string Prenom { get; set; }
            public string? AdresseSiege { get; set; } // "?" est la modification 
            public string? ZipCode { get; set; }
            public string? Ville { get; set; }
            public string? Pays { get; set; }
            public string? Societe { get; set; }
            public string? CodeIdentSociete { get; set; }
            public string? AdressesEnlevement { get; set; } 
            public int? RayonLivraison { get; set; }
            [Column(TypeName = "decimal(6,2)")]
            public decimal? RayonTarif { get; set; }
            public int? RayonDelai { get; set; }
        }
    La migration n'est plus vide, mais affiche ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    using Microsoft.EntityFrameworkCore.Migrations;
     
    #nullable disable
     
    namespace LeC_MVC_Auth_2024.Migrations.ApplicationDb
    {
        public partial class AddColums1 : Migration
        {
            protected override void Up(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.AlterColumn<string>(
                    name: "ZipCode",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "Ville",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "Societe",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "Prenom",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "Pays",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "CodeIdentSociete",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "Civilite",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AlterColumn<string>(
                    name: "AdresseSiege",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: true,
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)");
     
                migrationBuilder.AddColumn<string>(
                    name: "Discriminator",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "");
            }
     
            protected override void Down(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.DropColumn(
                    name: "Discriminator",
                    table: "AspNetUsers");
     
                migrationBuilder.AlterColumn<string>(
                    name: "ZipCode",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "Ville",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "Societe",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "Prenom",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "Pays",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "CodeIdentSociete",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "Civilite",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
     
                migrationBuilder.AlterColumn<string>(
                    name: "AdresseSiege",
                    table: "AspNetUsers",
                    type: "nvarchar(max)",
                    nullable: false,
                    defaultValue: "",
                    oldClrType: typeof(string),
                    oldType: "nvarchar(max)",
                    oldNullable: true);
            }
        }
    }
    ...
    Les colonnes sont donc vues comme devant être modifiées (AlterColumn) au lieu d'être ajoutées.
    Et je confirme qu'elles n'existent pas dans la base de données.

    Quand je lance un Upate-Database, j'obtiens des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ALTER TABLE ALTER COLUMN failed because column 'ZipCode' does not exist in table 'AspNetUsers'.
    Évidemment, puisque les colonnes n'existent pas.
    Sauf que la migration me dit, elle, que les colonnes sont juste à modifier.

    Un vrai sac de nœuds.
    Sur quoi s'appuie la migration pour ne pas "voir" que les colonnes sont absentes de la table ??
    Il existe forcément un fichier (caché ?) qui lui dit le contraire.
    Il y-a-t'il autre chose à faire que simplement supprimer les migrations de l'arborescence de ma solution quand elles ne sont pas bonnes ?

    Merci

  5. #5
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 167
    Points : 109
    Points
    109
    Par défaut
    Get-Migration renvoie :

    id name safeName applied
    -- ---- -------- -------
    20241026215743_Auth_Initialisation Auth_Initialisation Auth_Initialisation True
    20241028181340_AddColums1 AddColums1 AddColums1 False
    Je n'ai donc que 2 migrations enregistrées.
    Dont la dernière, nommée (avec beaucoup d'espoir de ma part) "AddColumns1", qui est non appliquée.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 790
    Points : 5 574
    Points
    5 574
    Par défaut
    Si tu supprimes les migrations de ta solution, il faut aussi les supprimer de la table __EFMigrationsHistory.

  7. #7
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 167
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par popo Voir le message
    Si tu supprimes les migrations de ta solution, il faut aussi les supprimer de la table __EFMigrationsHistory.
    Je ne comprends pas bien. Les migrations non appliquées, sont enregistrées dans la table ?
    Parce que je ne supprime pas des migrations appliquées (j'ai lu que ce n'était pas conseillé).

    Toujours est-il que le truc est "tombé en marche".
    Je n'ai pas arrêté d'alterner entre les deux versions de code que j'avais pour "ApplicationDbContext" (voir messages précédents) et hop ! Un miracle s'est produit.
    La migration affichait tout les AddColumn nécessaires.
    Je me suis dépêché de procéder au Update-Database, qui a bien fonctionné aussi.

    Comme je n'ai pas compris le problème, le truc me semble très aléatoire encore.

    J'avais ensuite un problème de connexion, il a fallu que je précise le contexte (IdentityUser) dans "ApplicationDbContext"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public class ApplicationDbContext : IdentityDbContext<IdentityUser>
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options)
            {
            }
            public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        }
    Et que je vide la table "AspNetUsers", qui contenait un user Admin.
    La table a ensuite accepté un nouvel User, les colonnes persos sont bien dans la table, ainsi qu'une colonne "Discriminator".
    On dirait donc que ça fonctionne.

    Je répugne à marquer le sujet comme "résolu", car je n'ai rien compris à ce problème qui risque de se reproduire.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 790
    Points : 5 574
    Points
    5 574
    Par défaut
    Citation Envoyé par AMP29 Voir le message
    Je ne comprends pas bien. Les migrations non appliquées, sont enregistrées dans la table ?
    Parce que je ne supprime pas des migrations appliquées (j'ai lu que ce n'était pas conseillé).
    Je répondais aux question que tu as posé, où justement, tu dis supprimer des migrations et ne pas comprendre sur quoi s'appuie l'outil :
    Sur quoi s'appuie la migration pour ne pas "voir" que les colonnes sont absentes de la table ??
    Il existe forcément un fichier (caché ?) qui lui dit le contraire.
    Il y-a-t'il autre chose à faire que simplement supprimer les migrations de l'arborescence de ma solution quand elles ne sont pas bonnes ?
    Donc la réponse est que l'outil va créer une nouvelle migration en comparant la structure déclarée dans cette table et celle de ton code.
    Et donc si, tu supprimes un un fichier de migration, il faut veiller à supprimer celle qui correspond dans la table (si, bien sûr, elle a été appliquée).


    Citation Envoyé par AMP29 Voir le message
    Comme je n'ai pas compris le problème, le truc me semble très aléatoire encore.
    Citation Envoyé par AMP29 Voir le message
    Je répugne à marquer le sujet comme "résolu", car je n'ai rien compris à ce problème qui risque de se reproduire.
    J'ai vu que tu avais posté sur un autre sujet en rapport avec ce projet.
    Je pense que tu essaies de réaliser ce projet sans vraiment maitriser les outils nécessaires à ce projet.
    Je te conseille de te concentrer sur EF Core et les migration sur un petit projet console pour maitriser le sujet avant de l'inclure dans un projet plus vaste.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/05/2017, 18h28
  2. [2.x] [FosUserBundle] Personnaliser register.html.twig
    Par yLaplace dans le forum Symfony
    Réponses: 1
    Dernier message: 24/04/2013, 15h49
  3. Variables register et auto
    Par Michaël dans le forum C
    Réponses: 17
    Dernier message: 21/08/2003, 12h09
  4. [VB6] [UserControl] Évènements personnalisés
    Par Frankywinky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2003, 18h56
  5. Register XMLC_LoginForm
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 22/04/2003, 20h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo