Échafaudage de migration Entity Framework 7 dans la bibliothèque de classes avec configuration

asp.net-core code-first-migrations dnx entity-framework-core visual-studio-2015

Question

Essayez d'ajouter des migrations à un modèle EF7 qui réside dans une bibliothèque de classes ASP.NET 5. Lorsque vous exécutez dnx . ef migration add mymigration échoue avec des résultats différents selon le projet sur lequel je l'exécute.

Si je l'exécute dans le dossier du projet principal, il ne peut pas localiser un DbContext , ce qui est logique car le DbContext est dans le projet partagé et les commandes ef ne se soucient probablement pas des dépendances.

Si je l'exécute dans le dossier du projet partagé, il n'a pas accès à la chaîne de connexion spécifiée dans le fichier startup.cs. J'ai glané des questions comme ce que cela fonctionne du projet partagé si vous spécifiez la chaîne de connexion dans la OnConfiguring méthode du DbContext mais je voudrais vraiment garder ce code distinct de la configuration.

Je suis tombé sur des journaux de problèmes dans le référentiel EF7 qui mentionnaient qu'ils implémentaient des options de ligne de commande pour spécifier un projet et un contexte, mais il n'y avait aucun exemple et je ne pouvais pas comprendre comment l'utiliser à partir du code source de l'historique de validation .

Réponse acceptée

Voici une approche qui pourrait fonctionner pour vous.

Si je l'exécute dans le dossier du projet partagé, il n'a pas accès à la chaîne de connexion spécifiée dans le fichier startup.cs.

Startup.cs

Je suppose que dans votre fichier Startup.cs, vous spécifiez la chaîne de connexion en accédant à la Configuration plutôt qu'en la codant en dur. De plus, je suppose que dans le constructeur de votre fichier Startup.cs, vous configurez la configuration à partir de quelques sources. En d'autres termes, votre fichier Startup.cs pourrait ressembler à ceci:

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

config.json

De plus, je suppose que vous ajoutez la chaîne de connexion à un fichier config.json à la racine de votre projet (ou que vous l'ajoutez via des secrets utilisateur ou des variables d'environnement.) Votre fichier config.json pourrait ressembler à ceci:

{
  "ConnectionStrings": {
    "MyDbContext": "Some-Connection-String"
  }
}

Si vous ne le faites pas de cette façon, cela pourrait valoir la peine de l'essayer.

Des questions comme celle-ci m'ont permis de comprendre que le projet partagé fonctionne si vous spécifiez la chaîne de connexion dans la méthode OnConfiguring du DbContext, mais j'aimerais vraiment que ce code soit séparé de la configuration.

DbContext

Si mes hypothèses ci-dessus sont correctes, vous pouvez accéder à la chaîne de connexion dans DbContext en utilisant le même modèle que vous avez utilisé dans la classe de Startup . En d’autres DbContext , dans le constructeur DbContext , configurez IConfiguration . Ensuite, dans OnConfiguring , accédez à la chaîne de connexion. Cela pourrait ressembler à quelque chose comme ça:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<SomeModel>().Key(e => e.Id);
        base.OnModelCreating(builder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = Config["ConnectionStrings:MyDbContext"];
        optionsBuilder.UseSqlServer(connString);
    }

    public IConfiguration Config { get; set; }

    public MyDbContext()
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Config = config;
    }
}

Structure du projet

Vous aurez bien sûr besoin d’un fichier config.json à la racine de votre dossier de projets partagés. Ainsi, la structure de vos projets pourrait ressembler à ceci:

SharedDataContext
    Migrations
    config.json
    project.json

WebApp
    config.json
    project.json
    Startup.cs

Dans ce qui précède, les deux fichiers config.json contiennent un paramètre de chaîne de connexion pour DbContext .

Quelques idées

Si vous n'aimez pas dupliquer les éléments de la chaîne de connexion config.json, vous pouvez utiliser des variables d'environnement ou des secrets d'utilisateur.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi