Concevez un modèle de données
Revenons à notre modèle de base et réfléchissons à la manière de l'affiner et de l'améliorer.
Voici ce avec quoi nous avons commencé :
Commençons à ajouter les propriétés logiquement associées à chaque entité de données et voyons si le modèle tient la route. Pour l'entité Utilisateur, nous n'avons pas besoin de grand-chose pour le moment. Il nous faut juste une adresse e-mail et un mot de passe pour la connexion. Puisque nous utilisons Entity Framework et Identity pour gérer les comptes d'utilisateur, ces propriétés seront déjà présentes dans notre objet Utilisateur, accompagnées d'une propriété Id, qui identifie de manière unique chaque objet. La propriété Id sert également de clé primaire dans la table correspondante de la base de données.
Chacun des autres objets doit lui aussi avoir une propriété Id qui servira de clé primaire.
D'après la liste des besoins établie pour notre application, chaque utilisateur n'aura qu'une seule liste contenant plusieurs films. Par conséquent, cette liste a-t-elle besoin de ses propres propriétés ? Nous savons qu'elle appartient à un utilisateur et qu'elle contient des films, mais nous n'avons pas précisé si elle aurait besoin de propriétés supplémentaires. Par conséquent, nous pourrions la considérer comme une propriété de l'entité Utilisateur, une liste d'objets Film.
Voici un autre design possible :
Dans ce schéma, nous avons ajouté des propriétés aux entités et supprimé l'entité Liste de films, en la plaçant dans l'entité FilmUtilisateur. Utilisez les propriétés Id des entités Utilisateur et Film comme clés primaires composites pour l'entité FilmUtilisateur. Cela permet d'identifier de manière unique une entité FilmUtilisateur comme appartenant à un utilisateur et à un film précis. Ce type de relation est également connu sous le nom de relation many-to-many (plusieurs à plusieurs) dans le vocabulaire des bases de données, ce qui signifie que plusieurs utilisateurs peuvent regarder et noter le même film et que plusieurs films peuvent appartenir au même utilisateur. Comment coder ce modèle ?
Codez les classes du modèle
Nous avons deux classes d'entités primaires : Film et Utilisateur. Nous disposons également d'une autre classe d'entité, FilmUtilisateur, qui représente la relation many-to-many entre les deux autres entités de la base de données.
Chaque classe d'entité doit avoir une clé primaire, généralement représentée par une propriété nommée Id ou un nom approchant. Commençons donc le codage par la classe Film. Tout d'abord, cette classe a besoin d'une propriété Id de type entier, d'un titre de type chaîne et d'une année de type entier. Pour ajouter cette classe, cliquez avec le bouton droit de la souris sur le dossier Data, puis sélectionnez Ajouter > Classe. Nommez le fichier de classe Film.cs puis cliquez sur le bouton Ajouter. Ajoutez ensuite les propriétés nécessaires à la classe Film, comme indiqué ci-dessous :
public class Film
{
public int Id { get; set; }
public string Titre { get; set; }
public int Annee { get; set; }
}
Passons à l'entité Utilisateur. Celle-ci est un peu plus délicate. Puisque le projet comprend des comptes d'utilisateur individuels, des objets de compte d'utilisateur sont déjà intégrés dans le projet grâce à ASP.NET Identity. Ils sont créés à l'aide d'une classe appelée IdentityUser, qui se trouve dans le package Microsoft.AspNetCore.Identity. La classe IdentityUser contient toutes les informations importantes permettant de sécuriser les connexions des utilisateurs, telles que le nom d'utilisateur, l'adresse e-mail, le mot de passe, le numéro de téléphone, etc. Cependant, elle ne contient pas de champs pour les informations personnelles telles que le nom ou le prénom, l'adresse, la ville, l'État, etc. Heureusement, il s'agit d'une classe que vous pouvez étendre à une autre classe de votre conception qui peut contenir tous les champs supplémentaires que vous souhaitez ajouter.
Il y a un autre point que je tiens à mentionner avant d'ajouter cette classe. ASP.NET Identity possède déjà un objet appelé User qui est réservé à l'accès au compte de l'utilisateur connecté. Par conséquent, il ne faut pas nommer votre classe d'entité utilisateur User. Appelons-la plutôt Utilisateur. Ajoutez donc une autre classe au dossier Data, appelez-la Utilisateur, puis intégrez-y les éléments suivants :
La classe doit étendre Microsoft.AspNetCore.Identity.IdentityUser.
Elle doit disposer d'un constructeur qui appelle le constructeur de l'objet hérité. Si vous n'avez jamais utilisé cette syntaxe auparavant, voici à quoi elle doit ressembler :
public Utilisateur() : base()
{
}
3. Elle doit contenir au moins une propriété Prenom de type chaîne de caractères.
Nous allons revenir à notre classe Utilisateur dans un moment. Pour l'instant, intéressons-nous à la classe FilmUtilisateur. Ajoutez cette classe au dossier Data, puis intégrez-lui des propriétés, comme indiqué ci-dessous :
public class FilmUtilisateur
{
public string IdUtilisateur { get; set; }
public int IdFilm { get; set; }
public bool Vu { get; set; }
public int Note { get; set; }
}
La classe FilmUtilisateur possède la clé primaire composite dont nous avons fait mention plus haut. Cette clé est composée de deux propriétés : IdUtilisateur et IdFilm. La propriété IdUtilisateur correspond à la propriété Id de la classe Utilisateur, qu'elle a héritée de IdentityUser. La propriété IdFilm correspond à la propriété Id de la classe Film. Pour compléter la classe FilmUtilisateur, vous avez besoin de deux autres propriétés. Ces propriétés utilisent le mot clé virtual et représentent la relation entre l'objet FilmUtilisateur et les objets Utilisateur et Film.
public virtual Utilisateur User { get; set; }
public virtual Film Film { get; set; }
Les classes Film et FilmUtilisateur étant maintenant terminées, reprenons la classe Utilisateur. Nous devons ajouter une propriété virtuelle pour représenter la liste des films de l'utilisateur. Il s'agit d'une collection ou d'une liste d'objets FilmUtilisateur, et plus précisément, de tous les objets FilmUtilisateur contenant l'identifiant de l'utilisateur. Mettons à jour notre classe Utilisateur pour inclure cette propriété et initialisons-la dans le constructeur, comme indiqué ci-dessous :
public class Utilisateur : Microsoft.AspNetCore.Identity.IdentityUser
{
public Utilisateur() : base()
{
this.ListeFilms = new HashSet<FilmUtilisateur>();
}
public string Prenom { get; set; }
public virtual ICollection<FilmUtilisateur> ListeFilms { get; set; }
}
Le modèle de données de notre projet est maintenant achevé. Compilez le code en générant votre projet (choisissez Générer > Générer la solution ou appuyez sur Ctrl-Maj-B). S'il y a des erreurs dans votre code, corrigez-les et recompilez le projet. Recommencez jusqu'à ce qu'il n'y ait plus d'erreurs de compilation.
Vous avez maintenant un modèle de données complet pour votre application Watchlist, mais pas de base de données qui reflète ce nouveau modèle. Dans le chapitre suivant, nous allons mettre à jour la base de données pour qu'elle corresponde à notre code.
En résumé
Dans ce chapitre, nous avons affiné le modèle de données de l'application Watchlist, en nous éloignant un peu du concept initial. Nous avons peaufiné une conception qui permet à chaque utilisateur de créer sa propre liste de films. Ils peuvent ainsi donner une note individuelle à leurs films, tout en étant en mesure de voir les notes moyennes données par les autres utilisateurs.
Nous avons codé l'ensemble du modèle sous forme de classes C# et sommes maintenant prêts à transposer ce modèle dans une base de données relationnelle.
Dans le chapitre suivant, nous allons achever la liaison de l'application à sa base de données. Ensuite, nous allons effectuer une migration code first pour consolider le modèle de données sous forme de base de données.