Después de actualizar a ASP.NET Core 2.0, me parece que no puede crear las migraciones más.

Estoy recibiendo

«Se ha producido un error al llamar el método ‘BuildWebHost’ en la clase
‘Programa’. De continuar sin que el proveedor de servicios de aplicación. Error:
Uno o más errores. (No se puede abrir la base de datos «…» solicitada por
el inicio de sesión. El error de inicio de sesión. Error de inicio de sesión del usuario ‘…'»

y

«No se puede crear un objeto de tipo ‘MyContext’. Agregar una aplicación
de ‘IDesignTimeDbContextFactory’ para el proyecto, o ver
https://go.microsoft.com/fwlink/?linkid=851728 para patrones adicionales
apoyado en tiempo de diseño.»

El comando que ejecutó fue $ dotnet ef migrations add InitialCreate --startup-project "..\Web" (desde el proyecto/carpeta con el DBContext).

Cadena de conexión: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

Este es mi Programa.cs

 public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
       WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>()
           .Build();
}
  • Posiblemente el problema no está en el Programa.cs. Es, probablemente, el uso de una instrucción de carga de datos de semillas al final de su método Configure (): DbInitializer.Inicializar (contexto); Si usted tiene la instrucción de que, un comentario: //DbInitializer.Inicializar(contexto); a Continuación, ejecute la Migración instrucciones para el test. Si el problema surge, entonces el seguimiento de la DbInitializer.cs de la clase.
  • Es su MyContext clase en otro proyecto de biblioteca de clases?
  • Mismo problema aquí, el contexto está en otra biblioteca. Si id añadir un parámetro menos consturctor el contexto, las migraciones son el trabajo, pero con el mismo error: (se produjo Un error al llamar el método ‘BuildWebHost’ de la clase ‘Programa’. De continuar sin que el proveedor de servicios de aplicación. Error: referencia a Objeto no establecida como instancia de un objeto. )
  • Lo has resuelto en la final?
  • gracias por ese comentario. Me comentó mi Siembra Métodos de Migraciones y comenzó a trabajar de nuevo. Un millón de gracias !!!
  • Comprobar en el Inicio.cs si hay una línea con service.DbContext<YourContext>. Si no agregar y tratar de hacer una migración.

InformationsquelleAutor ruhm | 2017-08-20

24 Comentarios

  1. 93

    Usted puede agregar una clase que implementa IDesignTimeDbContextFactory dentro de su proyecto Web.

    Aquí está el código de ejemplo:

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CodingBlastDbContext>
    {
        public CodingBlastDbContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<CodingBlastDbContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseSqlServer(connectionString);
            return new CodingBlastDbContext(builder.Options);
        }
    }

    A continuación, vaya a su proyecto de Base de datos y ejecutar la siguiente línea de comando:

    dotnet ef migrations add InitialMigration -s ../Web/
    
    dotnet ef database update -s ../Web/
    
    -s stands for startup project and ../Web/ is the location of my web/startup project.

    de recursos

    • Estoy consiguiendo: El archivo de configuración ‘appsettings.json’ no fue encontrado y no es opcional. La ruta de acceso física es ‘C:\Users\XXX\Documents\Visual Estudio De 2017\Proyectos\XXX\src\XXX.Api\bin\Debug\netcoreapp2.0\appsettings.json’. Mi appsettings es en C:\Users\XXX\Documents\Visual Estudio De 2017\Proyectos\XXX\src\XXX.La Api.
    • Asegúrese de que usted tiene el appsettings.json conjunto de archivos para copiar local debería solucionar el problema con él para no ser encontrado
    • Esta solución presenta una dependencia en el Marco de la Entidad en la aplicación host (en mi caso este es un proyecto Web). Es allí cualquier manera de conseguir alrededor de esto? Me gustaría que mi Repositorio de la biblioteca para mantener el EF cosas, y no introducir EF en la aplicación web.
    • A pesar de que este es el aceptado la respuesta, este es el mejor: stackoverflow.com/a/52671330/1737395 de Hecho, la ejecución de la migración con –verbose bandera de la ayuda grandemente
  2. 49

    Sin necesidad de IDesignTimeDbContextFactory.

    Ejecutar

    add-migration initial -verbose

    que revelan los detalles bajo

    Se ha producido un error al acceder a la IWebHost en clase ‘Programa’. De continuar sin que el proveedor de servicios de aplicación.

    advertencia, la cual es la raíz causa del problema.

    En mi caso, problema fue que, después de haber ApplicationRole : IdentityRole<int> y la invocación de services.AddIdentity<ApplicationUser, IdentityRole>() que estaba causando siguiente mensaje de error

    System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
    on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
    TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
    ---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
    on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
    TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.
    • Esto es raro, el comando add-migration initial tiró el error no dbcontext encontrado, pero cuando me encontré con add-migration initial -verbose funcionó a la perfección. No he hecho ningún cambio de código sólo se ha cambiado el comando. Alguna idea de por qué?
    • bueno, eso es muy raro. Espero -verbose para exponer el error subyacente detalles. No muy segura de por qué se ha corregido un error.
    • Sí Detallado de hecho ayuda a descubrir el verdadero problema. En mi caso no ha añadido AddDbContext servicios de inicio.
    • Hmm me agregue a la migración inicial trabajado. ¿Cómo es trabajado, mientras que el uso de dotnet ef migraciones agregar inicial no?
    • No seguro por qué esto funcionó, pero lo hizo. Gracias!
    • dotnet ef migraciones agregar InitialCreate –verbose
    • Gracias por eso, en mi caso yo no tiene un constructor sin parámetros en mi ApplicationDbContext.

  3. 10

    En mi caso, la causa del problema fue de múltiples proyectos de inicio. Tengo tres proyectos en mi solución: Mvc, Api, y Dal. DbContext y las Migraciones en el Dal proyecto.

    Me había configurado varios proyectos de inicio. Ambos Mvc y la Api de proyectos que se estaban ejecutando cuando me clic en Iniciar. Pero en este caso estaba recibiendo este error.

    «No se puede crear un objeto de tipo ‘MyContext’. Agregar una aplicación
    de ‘IDesignTimeDbContextFactory’ para el proyecto, o ver
    https://go.microsoft.com/fwlink/?linkid=851728 para patrones adicionales
    apoyado en tiempo de diseño.»

    Yo podría añadir con éxito la migración después de la configuración de Mvc como el único proyecto de inicio y seleccionando Dal en la Consola del Administrador de Paquetes.

    • Gracias, de cierta manera, lo mismo me pasó a mí. He tenido que cambiar el inicio del proyecto hasta el lugar donde Inicio/Programa de clases existe. El mensaje de error es una broma de mal gusto.
    • Los mensajes de salida fueron muy frustrante. Yo no tenía ningún proyecto de inicio seleccionado, de forma inesperada. Esta fue la razón por la que dbContext no pudo ser creado. Gracias.
    • Gracias, esto funciona para mí. !!!
  4. 8
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }
    
        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
        }
    }

    Simplemente cambie el nombre de BuildWebHost() a CreateWebHostBuilder(), porque las migraciones uso de este método por defecto.

    • QUÉ. Esto debe ser objeto de publicidad en todas las páginas relacionadas con este tema ¿en serio son. El éxito instantáneo. Gracias.
    • Guardar mi día !!! Es muy extraño error. Estoy usando .net core 3.0 con vista previa 7 y este error stil existen
    • leer esto devblogs.microsoft.com/dotnet/…
  5. 8

    Una solución mejor :

    Si su proyecto de inicio es una ASP.NET Core, la aplicación de herramientas de intentar obtener la DbContext objeto de la aplicación del proveedor de servicios.

    La herramienta de primer intento para obtener el proveedor de servicios mediante la invocación de Program.BuildWebHost() y el acceso a la IWebHost.Services propiedad.

    agregar este método tras Método Principal en el Programa.cs

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

    Actualización .net core 2.2

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    } 

    Otra solución posible,:

    Asegúrese de que usted agrega Dbcontext a la inyección de dependencia:
    AddDbContext<TContext> va a hacer que su DbContext tipo, TContext, y la correspondiente DbContextOptions<TContext> disponible para la inyección desde el contenedor de servicio.
    Esto requiere la adición de un constructor argumento a su DbContext tipo que acepta DbContextOptions<TContext>.

    Ejemplo:
    En El Inicio.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
    }

    AppDbContext código:

    public class AppDbContext: DbContext
    {
        public AppDbContext(DbContextOptions<BloggingContext> options)
          :base(options)
        { }
    
    }

    Actualización:
    Conjunto de Proyecto de Aplicación Web para «Establecer como Proyecto de Inicio»

    Abra la Consola del Administrador de Paquetes desde el menú Tools -> NuGet Package Manger -> Package Manager Console en Visual Studio para ejecutar los siguientes comandos.

    Add-Migration Init -Verbose

    Nota: el Uso de la –verbose opción para ver las instrucciones SQL ser
    aplicado a la base de datos de destino. Contiene errores detallados.

    • Esto funcionó para mí. Cambiado el BuildWebHost función en el Programa.cs de public static IWebHostBuilder BuildWebHost(string[] args) a public static IWebHost BuildWebHost(string[] args) con el .Build() ahora se incluye en la función
    • Chicos, si usted está utilizando ASP.NET Core 2.1+ usted BuildWebHost método tiene un nombre diferente – CreateWebHostBuilder porque de docs.microsoft.com/en-us/aspnet/core/migration/… para cambiar el nombre de CreateWebHostBuilder a BuildWebHost y de la migración se encuentra BuildWebHost y tomar DbContext de ella.
    • Gracias compañero, se soluciona después de pasar 2 horas para configurar sin necesidad de utilizar IDesignTimeDbContextFactory
    • Gracias por «Detallado» de la bandera. Esto me ha ayudado a encontrar la raíz de la causa de la excepción.
    • Gracias ! trabajó para mí en el Núcleo 3 del proyecto.
  6. 6

    En el AppContext.cs además de AppContext clase de agregar otra clase:

    //required when local database deleted
    public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
    {
        public AppContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<AppContext>();
              builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
            return new AppContext(builder.Options);
        }
    }

    Que esto va a resolver el segundo problema:

    «No se puede crear un objeto de tipo ‘MyContext’. Agregar una aplicación de ‘IDesignTimeDbContextFactory’ para el proyecto,

    Después de que usted será capaz de añadir a la migración Inicial y ejecutarlo mediante la ejecución de de la actualización de la base de datos comando.
    Sin embargo, si la ejecución de estos comandos cuando no hay ninguna Base de datos todavía en su local de SqlServer obtendrá la advertencia como su primer error: «error

    se produjo mientras el método de llamada ‘BuildWebHost’ de la clase ‘Programa’ La…
    error de inicio de sesión. Error de inicio de sesión del usuario ‘…'»

    Pero no es error, ya que la migración va a ser creado y puede ser ejecutado.
    Así que simplemente ignorar este error por primera vez, y el último, ya Db va a existir que no volverá a suceder.

  7. 4

    por favor, compruebe que dispone de la referencia

    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
    • Estoy usando <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" /> que incluye la referencia. He intentado también como la anterior, pero no hubo cambio.
  8. 4

    Algo que realmente me ayudó fue en este artículo: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/

    La idea básica es que en el cambio de .net core de 1 a 2 de inicialización de base de datos debe ser trasladado fuera de la StartUp.cs y en el Programa.cs. De lo contrario, la EF tareas de probar y ejecutar la DB inits al hacer las tareas.

    «Hay una buena sección en el oficial de migración docs ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ), titulado «Mover la base de datos de código de inicialización», que me parecía haber perdido. Así que antes de bajar cualquier conejo agujeros como yo lo hice asegurarse de que esto no es lo que está causando su necesidad de agregar una aplicación de IdesignTimeDbContextFactory.»

    • Gracias, esto me ayudó demasiado.
  9. 3

    Puede intentar esta solución de esta discusión, que fue inspirado por este post.

    public static IWebHost MigrateDatabase(this IWebHost webHost)
    {
        using (var scope = webHost.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
    
            try
            {
                var db = services.GetRequiredService<MyContext>();
                db.Database.Migrate();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred while migrating the database.");
            }
        }
    
        return webHost;
    }
    public static void Main(string[] args)
    {
        BuildWebHost(args)
            .MigrateDatabase()
            .Run();
    }
    • Todavía estoy consiguiendo: Agregar una aplicación de ‘IDesignTimeDbContextFactory<DatabaseContext>’……
  10. 3

    He tenido este problema ya esta resuelto Por Set -> Aplicaciones Web(Incluido el Programa.cs) Proyecto a -> «Establecer como Proyecto de Inicio»

    A continuación, ejecutar -> agregar a la migración inicial detallado

    en la Consola del Administrador de Paquetes

    Establecer como Proyecto de Inicio

    • Gracias, la única solución que funcionó para mí fue establecer el proyecto web como proyecto de inicio y eso es exactamente lo que debía hacerse.
  11. 3

    Si quieres evitar los IDesignTimeDbContextFactory cosa: Sólo asegúrese de que usted no utilice ninguna Semilla método en su inicio. Yo estaba usando una estática de la semilla método en mi inicio y que estaba causando este error para mí.

  12. 2

    Anteriormente, se configura la semilla de datos en el método Configure () en el Inicio.cs. Ahora se recomienda que utilice el método Configure (sólo para configurar la canalización de solicitud. Inicio de la aplicación del código pertenece en el método Main.

    Refactorizado el método Main. Agregue las siguientes referencias para el Programa.cs:

    el uso de Microsoft.Las extensiones.DependencyInjection;

    utilizando MyProject.MyDbContextFolder;

    JS:

    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);
    
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var context = services.GetRequiredService<MyDbConext>();
                DbInitializer.Initialize(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred while seeding the database.");
            }
        }
    
        host.Run();
    }

  13. 2

    En mi caso tengo el problema porque yo tenía un método denominado SeedData.EnsurePopulated() se llama en mi de Inicio.cs archivo.

    public class Startup
    {
        public Startup(IConfiguration configuration) => Configuration = configuration;
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            //
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();
            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseSession();
            app.UseMvc(routes =>
            {
                //
            });
    
            SeedData.EnsurePopulated(app);
        }
    }

    El trabajo de SeedData clase es agregar inicial de los datos a la tabla de base de datos. Su código es:

    public static void EnsurePopulated(IApplicationBuilder app)
        {
            ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
            if (!context.Products.Any())
            {
                context.Products.AddRange(
                new Product
                {
                    Name = "Kayak",
                    Description = "A boat for one person",
                    Category = "Watersports",
                    Price = 275
                },
                ....
                );
                context.SaveChanges();
            }
        }

    SOLUCIÓN

    Antes de hacer la migración simplemente comentar la llamada de SeedData clase en el Inicio.cs archivo.

    //SeedData.EnsurePopulated(app);

    Que resolver mi problema y espero que tu problema está resuelto de la misma manera.

  14. 2

    De

    https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

    Cuando se crea un nuevo ASP.NET Core 2.0 de la aplicación, este es el gancho
    incluye por defecto. En versiones anteriores de EF Núcleo y ASP.NET Núcleo,
    las herramientas intente invocar el Inicio.ConfigureServices directamente en fin
    obtener la aplicación del proveedor de servicios, pero este patrón no
    funciona correctamente en ASP.NET Core 2.0 aplicaciones. Si va a actualizar
    un ASP.NET Núcleo 1.aplicación x a 2.0, usted puede modificar el Programa
    de la clase a seguir el nuevo patrón.

    Agregar Fábrica en .Net Core 2.x

    public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
        {
            public BloggingContext CreateDbContext(string[] args)
            {
                var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
                optionsBuilder.UseSqlite("Data Source=blog.db");
    
                return new BloggingContext(optionsBuilder.Options);
            }
        }
  15. 1

    Me encontré con el mismo problema. Tengo dos proyectos en la solución. que

    1. API
    2. Servicios y repos, que tienen los modelos de contexto

    Inicialmente, API proyecto fue establecer como proyecto de Inicio.

    He cambiado el proyecto de Inicio a uno de los cuales sostiene contexto clases.
    si usted está usando Visual Studio puede establecer un proyecto como proyecto de Inicio por:

    abrir el explorador de soluciones >> clic derecho en el contexto del proyecto >> seleccione Establecer como proyecto de Inicio

  16. 0

    Tengo el mismo problema desde que me refería antiguo de Microsoft.EntityFrameworkCore.Herramientas.DotNet

    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />

    Después de actualizar a la versión más reciente que se resolvió

  17. 0

    Principal del proyecto appsettings.archivo json, yo había puesto «Copiar al directorio de Salida» a «Copiar siempre» y funcionó.

  18. 0

    Muestra DB contexto de la clase .net core console aplicaciones

    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Design;
    using Microsoft.Extensions.Configuration;
    using System.IO;
    
    namespace EmailServerConsole.Data
    {
        public class EmailDBContext : DbContext
        {
            public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
            public DbSet<EmailQueue> EmailsQueue { get; set; }
        }
    
        public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
        {
            EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
            {
                IConfigurationRoot configuration = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json")
                    .Build();
                var builder = new DbContextOptionsBuilder<EmailDBContext>();
                var connectionString = configuration.GetConnectionString("connection_string");
                builder.UseSqlServer(connectionString);
                return new EmailDBContext(builder.Options);
            }
        }
    }
    • Mientras que esto puede responder a los autores en cuestión, carece de algunas de explicar las palabras y los enlaces a la documentación. Raw fragmentos de código no son muy útiles sin algunas frases a su alrededor. Usted también puede encontrar cómo escribir una buena respuesta muy útil. Por favor, edita tu respuesta.
  19. 0

    También se puede utilizar en el inicio del constructor de la clase para agregar archivo json (donde la cadena de conexión de mentiras) para la configuración. Ejemplo:

        IConfigurationRoot _config;
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json");
    
            _config = builder.Build();
        }
  20. 0

    Para mí fue debido a que he cambiado el Output Type de mi proyecto de inicio de Console Application a Class Library.

    Volver a Console Application hizo el truco.

  21. 0

    Tuve este problema en una solución que tiene:

    • una .NET Core 2.2 proyecto de MVC
    • una .NET Core 3.0 Blazor proyecto
    • La DB en un Contexto .NETO Estándar 2.0 proyecto de biblioteca de clases

    Me sale el «no se puede crear un objeto…» mensaje cuando el Blazor proyecto es establecer como proyecto de inicio, pero no se si el proyecto de MVC es establecer como proyecto de inicio.

    Que me intriga, porque en la Consola del Administrador de Paquetes (que es de donde yo soy la creación de la migración) tengo el Defecto de un conjunto de proyectos para la biblioteca de clases C# que en realidad contiene la base de datos de Contexto, y también estoy con la especificación de la base de datos del contexto en el que mi llamada para añadir a la migración add-migration MigrationName -context ContextName, por lo que parece extraño que Visual Studio se preocupa de lo que proyecto de inicio está establecido en la actualidad.

    Supongo que la razón es que cuando el Blazor proyecto es el proyecto de inicio de la PMC es determinar la versión de .Redes Core 3.0 desde el inicio del proyecto y, a continuación, tratando de utilizar para ejecutar las migraciones en el .NETO Estándar 2.0 de la biblioteca de clases y golpear a un conflicto de algún tipo.

    Cualquiera que sea la causa, el cambio del proyecto de inicio para el proyecto de MVC que los objetivos Básicos 2.2, en lugar de la Blazor proyecto, se ha solucionado el problema

  22. 0

    Primero de todo, asegúrese de que ha configurado la base de datos en Startup.cs
    En mi caso, yo estaba recibiendo este error, ya que yo no especificar lo de abajo en Startup.cs

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));
  23. -2

    Yo tenía el mismo problema. Acaba de cambiar el ap.jason de la aplicación.jason y se solucionó el problema

Dejar respuesta

Please enter your comment!
Please enter your name here