web-dev-qa-db-fra.com

Models.ApplicationDbContext pour tous les modèles dans une application Asp.Net MVC 5?

J'ai créé un site Web Asp.Net MVC 5. Je devrai ajouter des champs personnalisés dans ApplicationUser et associer (ajouter des clés étrangères) à d'autres modèles. Je pense que je devrais utiliser un seul type de contexte. Cependant, l'échafaudage de code génère déjà la classe ApplicationDbContext suivante. Puis-je mettre tout mon public DbSet<...> ... { get; set; } dans la classe? Ou existe-t-il un meilleur modèle?

namespace MyApp.Models
{
    // You can add profile data for the user by adding more properties to your User class, please visit http://go.Microsoft.com/fwlink/?LinkID=317594 to learn more.
    public class ApplicationUser : User
    {  
    }

    public class ApplicationDbContext : IdentityDbContextWithCustomUser<ApplicationUser>
    {
    }
}
30
ca9163d9

Il existe une excellente vidéo expliquant cette question. Il suffit de consulter le cours gratuit ASP.NET MVC 5 Fundamentals de Scott Allen. L'exact la réponse est ici (commence à 3h30).

28
zjerry

Je conseillerais de les garder séparés. Il n'y a vraiment aucune raison de coupler deux parties du système. Pour ajouter un autre DbContext, ajoutez simplement un fichier aux modèles appelé YourContext.cs.

public class YourContext: DbContext
{
    public YourContext() : base("name=YourContext")
    {
    }

    // Add a DbSet for each one of your Entities
    public DbSet<Room> Rooms { get; set; }
    public DbSet<Meal> Meals { get; set; }
}

Puis dans la racine web.config

<add name="YourContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=YourContext; Integrated Security=True"" providerName="System.Data.SqlClient" />

Lorsque vous exécutez enable-migrations dans la console du gestionnaire de packages, il vous sera demandé quel dbcontext vous souhaitez migrer. Choisissez YourContext.

EDIT: Pas besoin d'ajouter des référentiels/unités de travail, Entity Framework le fait pour vous.

10
stink

Veuillez noter: cela a été écrit comme en version beta2 où ALLOT a changé! Espérons que la majeure partie restera, mais il n'y a aucune garantie avant RC.

N'UTILISEZ PAS le gestionnaire de packages NuGET (jusqu'à RC) car il ne reprend PAS les packages .NET 5 requis et il installera EF 6 et mess votre projet. (Nous sommes après EF 7)

Dans le projects.json vous devez avoir les dépendances suivantes. (ou beta2 quand il est sorti, ou le dernier sur RC)

    "EntityFramework": "7.0.0-beta1",
    "EntityFramework.Relational": "7.0.0-beta1",
    "EntityFramework.Commands": "7.0.0-beta1",
    "EntityFramework.Migrations": "7.0.0-beta1",
    "EntityFramework.SqlServer": "7.0.0-beta1"

Ajoutez un nouveau dossier DBContexts et ajoutez un fichier c sharp avec vos nouveaux éléments de contexte.

  public class BlaBlaDB : DbContext
    {
        public DbSet<Models.MyOtherModel> MyOtherModels { get; set; }

        protected override void OnConfiguring(DbContextOptions options)
        {
            options.UseSqlServer();
        }
    }

et dans votre config.json assurez-vous d'ajouter une chaîne de connexion, exactement la même que IdentityDB juste avec votre nouveau nom. Puis dans startup.json enregistrez votre base de données.

 services.AddEntityFramework(Configuration)
                .AddSqlServer()
                .AddDbContext<DataContexts.IdentityDB>()
                .AddDbContext<DataContexts.BlaBlaDB>();

Cela doit être compilé car k exécutera ce projet et utilisera le démarrage pour injecter votre contexte et ensuite exécuter tout ce dont vous avez besoin. Pour l'instant VS2015 Beta n'a PAS tout/ou ils ne fonctionnent pas, la commande pour EF.

Vous devez aller installer KRE pour Windows.

Ouvrez l'invite de commande, accédez à votre répertoire de projet, entrez la solution et entrez les commandes suivantes.

k ef context list
k ef migration add -c (context.from.above) initial
k ef migration apply -c (context.from.above)

Vous avez maintenant une migration multi-contexte. Continuez simplement à ajouter du contexte et répétez cela selon vos besoins. Je l'ai utilisé sur localdb, comme configuration de projet par défaut afin qu'il puisse fonctionner de manière autonome dans n'importe quel environnement, comme Linux.

Remarque: vous devez toujours créer un service contenant l'interface et l'implémentation, puis l'enregistrer dans startup.jsonPlus d'informations ici

1
Piotr Kula