EntityFramework 7 (EF7) Migrations. DbContext et StartUp Project sont dans des assemblys différents

asp.net-core-mvc entity-framework-core

Question

J'essaie d'utiliser les migrations dans EF7 avec entityframework.commands. Mais mon DbContext est dans un assemblage différent avec un projet de démarrage (asp.net mvc est un projet de démarrage et Core.Implementation possède un DbContex).

dnx. ef migration ajouter MyMigration -c MyContext

System.InvalidOperationException: Aucun DbContext nommé 'MyContext' n'a été trouvé.

J'ai essayé d'utiliser un espace de noms pour désigner un autre assemblage, mais cela n'a pas fonctionné non plus. Est-ce possible? Ou je dois juste mettre mon contexte en assembleur où la commande ef7 est?

Réponse acceptée

Pour les numéros 639 , 2256 , 2293 , 2294 , 2357 , 2553 et 2748 , nous avons un peu de travail à faire dans ce domaine. :-)


Réponse populaire

MODIFIER

Depuis 1.0.0-rc1-final (peut-être plus tôt), cette tâche est inutile.

  • Maintenant, vous n'avez plus besoin de App.DataAccess/Startup.cs (supprimez-le simplement si vous avez utilisé la solution de contournement ci-dessous).
  • Vous créez / exécutez des migrations à partir de votre projet principal (dans ce cas, App.Web ).
  • Cependant, vous devez spécifier le projet (paramètre -p ) contenant les migrations:

cd App.Web
dnx ef migrations add NewMigration -p App.DataAccess

Si vous avez plusieurs contextes de base de données, vous devez également spécifier lequel utiliser (paramètre -c )

cd App.Web
dnx ef migrations add NewMigration -p App.DataAccess -c YourDbContext

FIN DE L'EDIT

J'ai découvert une solution de contournement pour cela

Supposons que vous ayez 2 projets: App.Web et App.DataAccess

Vous pouvez ajouter une classe de démarrage très basique à votre App.DataAccess :

>App.Web
-->Startup.cs // your main startup
>App.DataAccess
-->path/to/ApplicationDbContext.cs
-->different/path/to/YourModels.cs
-->Startup.cs // add a simple startup class
-->project.json

La classe de démarrage simple ( App.DataAccess\Startup.cs ):

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.Data.Entity;
using Microsoft.Dnx.Runtime;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.Logging;

namespace App.DataAccess
{
    public class Startup
    {
        public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
        {
            var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
                .AddJsonFile("../App.Web/config.json"); // path to your original configuration in Web project

            Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
        }
    }
}

Que modifier votre project.json dans App.DataAccess ( App.DataAccess/project.json ):

{
  "version": "1.0.0-*",
  "description": "App.DataAccess Class Library",
  "authors": [ "Author" ],
  "tags": [ "" ],
  "projectUrl": "",
  "licenseUrl": "",
  "frameworks": {
    "dnx451": { }
  },

  "dependencies": {
    "EntityFramework.Commands": "7.0.0-beta7",
    "Microsoft.Framework.Configuration.Json": "1.0.0-beta7",
  },

  "commands": {
    "ef": "EntityFramework.Commands" // this line is important, it will give you access to 'dnx ef' in command line
  }
}

Tout ce que vous avez à faire est d’aller sur App.DataAccess et d’utiliser dnx ef :

cd App.DataAccess
dnx ef migrations add NewMigration
dnx ef migrations remove
dnx ef database update
dnx ef ...


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