Une application MVC 5 par défaut est livrée avec ce morceau de code dans IdentityModels.cs - ce morceau de code est pour toutes les opérations d'identité ASP.NET pour les modèles par défaut:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Si j'échafaude un nouveau contrôleur en utilisant des vues avec Entity Framework et crée un "Nouveau contexte de données ..." dans la boîte de dialogue, je reçois ceci généré pour moi:
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; }
}
}
Si j'échafaudais un autre contrôleur + vue en utilisant EF, par exemple pour un modèle Animal, cette nouvelle ligne serait automatiquement générée sous public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- comme ceci:
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
(pour tous les trucs d'identité ASP.NET) hérite de IdentityDbContext
qui à son tour hérite de DbContext
.
AllOtherStuffDbContext
(pour mes propres affaires) hérite de DbContext
.
Ma question est donc:
Lequel de ces deux ( ApplicationDbContext
et AllOtherStuffDbContext
) devrais-je utiliser pour tous mes autres modèles? Ou devrais-je simplement utiliser la génération automatique par défaut ApplicationDbContext
car cela ne devrait pas être un problème de l'utiliser car elle dérive de la classe de base DbContext
, ou y aura-t-il des frais généraux? Vous ne devez utiliser qu'un seul DbContext
objet dans votre application pour tous vos modèles (je l'ai lu quelque part), donc je ne devrais même pas envisager d'utiliser les deux ApplicationDbContext
et AllOtherStuffDbContext
dans une seule application? Ou quelle est la meilleure pratique dans MVC 5 avec ASP.NET Identity?
Réponses:
J'utiliserais une seule classe Context héritant d'IdentityDbContext. De cette façon, vous pouvez faire en sorte que le contexte soit au courant des relations entre vos classes et IdentityUser et les rôles d'IdentityDbContext. Il y a très peu de frais généraux dans IdentityDbContext, il s'agit essentiellement d'un DbContext normal avec deux DbSets. Un pour les utilisateurs et un pour les rôles.
la source
Il y a beaucoup de confusion à propos d' IdentityDbContext , une recherche rapide dans Stackoverflow et vous trouverez ces questions:
« Pourquoi l'identité Asp.Net IdentityDbContext est-elle une boîte noire?
Comment puis-je changer les noms de table lors de l'utilisation de Visual Studio 2013 AspNet Identity?
Fusionner MyDbContext avec IdentityDbContext "
Pour répondre à toutes ces questions, nous devons comprendre que IdentityDbContext n'est qu'une classe héritée de DbContext.
Jetons un coup d'œil à la source IdentityDbContext :
Sur la base du code source si nous voulons fusionner IdentityDbContext avec notre DbContext, nous avons deux options:
Première option:
créer un DbContext qui hérite d'IdentityDbContext et avoir accès aux classes.
Notes supplémentaires:
1) Nous pouvons également modifier les noms de table par défaut de asp.net Identity avec la solution suivante:
2) De plus, nous pouvons étendre chaque classe et ajouter n'importe quelle propriété à des classes comme 'IdentityUser', 'IdentityRole', ...
Pour gagner du temps, nous pouvons utiliser le modèle de projet extensible AspNet Identity 2.0 pour étendre toutes les classes.
Deuxième option:(Non recommandé)
En fait, nous n'avons pas à hériter d'IdentityDbContext si nous écrivons nous-mêmes tout le code.
Donc, fondamentalement, nous pouvons simplement hériter de DbContext et implémenter notre version personnalisée de "OnModelCreating (ModelBuilder builder)" du code source IdentityDbContext
la source
Ceci est une entrée tardive pour les gens, mais voici ma mise en œuvre. Vous remarquerez également que j'ai supprimé la possibilité de modifier le type par défaut des touches: les détails à ce sujet peuvent être trouvés dans les articles suivants:
REMARQUES:
Il convient de noter que vous ne pouvez pas utiliser
Guid's
vos clés. En effet, sous le capot, ils sont unStruct
, et en tant que tels, n'ont pas de déballage qui permettrait leur conversion à partir d'un<TKey>
paramètre générique .LES COURS SONT COMME:
la source
Si vous explorez les abstractions de IdentityDbContext, vous constaterez qu'il ressemble à votre DbContext dérivé. Le chemin le plus simple est la réponse d'Olav, mais si vous voulez plus de contrôle sur ce qui est créé et un peu moins de dépendance sur les packages d'identité, jetez un œil à ma question et réponse ici . Il y a un exemple de code si vous suivez le lien, mais en résumé, vous ajoutez simplement les DbSets requis à votre propre sous-classe DbContext.
la source