218 votes

Confusion d’identité DbContext ASP.NET

Un défaut MVC 5 App est livré avec ce morceau de code dans IdentityModels.cs - ce morceau de code est pour tous les ASP.NET l'Identité des opérations pour les modèles par défaut:

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

Si je échafaudage d'un nouveau contrôleur à l'aide de vues avec Entity Framework et de créer un "Nouveau contexte de données..." dans la boîte de dialogue, j'obtiens ce générés 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 je échafaudage d'un autre contrôleur + vue à l'aide d'EF, dire par exemple pour un modèle Animal, cette nouvelle ligne serait d'obtenir générée automatiquement droit en vertu de l' 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 ASP.NET l'Identité des trucs) hérite de l' IdentityDbContext qui hérite de DbContext. AllOtherStuffDbContext (pour mes propres trucs) hérite de l' DbContext.

Donc ma question est:

Laquelle de ces deux (ApplicationDbContext et AllOtherStuffDbContext) dois-je utiliser pour tous mes autres modèles? Ou devrais-je simplement utiliser la valeur par défaut générée automatiquement ApplicationDbContext car il ne devrait pas être un problème à l'utiliser car elle dérive de la classe de base DbContext, ou aura-t-il des coûts? Vous devez utiliser un seul DbContext objet dans votre application pour tous les modèles (j'ai lu cela quelque part) donc je ne devrait même pas envisager d'utiliser les deux ApplicationDbContext et AllOtherStuffDbContext dans une seule application? Ou quelles sont les meilleures pratiques en MVC 5 avec ASP.NET l'Identité?

197voto

Olav Nybø Points 4054

Je voudrais utiliser une seule classe de contexte qui hérite de IdentityDbContext. De cette façon vous pouvez avoir le contexte être au courant de toute relation entre vos classes et les rôles de la IdentityDbContext et de IdentityUser. Il y a très peu de traitement supplémentaire dans le IdentityDbContext, il s’agit essentiellement d’un DbContext régulier avec deux DbSets. Un pour les utilisateurs et un pour les rôles.

8voto

joelmdev Points 2215

Si vous explorez les abstractions de la IdentityDbContext, vous constaterez qu'il ressemble tout à fait à votre dérivés DbContext. L'itinéraire le plus simple est Olav réponse, mais si vous voulez plus de contrôle sur ce qui se créé et un peu moins de dépendance sur l'Identité des paquets ont un coup d'oeil à ma question et la réponse ici. Il y a un exemple de code si vous suivez le lien, mais en résumé il suffit d'ajouter le nécessaire DbSets à votre propre DbContext sous-classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X