Después de actualizar a ASP.NET Core 2.0, parece que ya no puedo crear migraciones.
Me estoy poniendo
"Se produjo un error al llamar al método 'BuildWebHost' en la clase 'Programa'. Continuando sin el proveedor de servicios de la aplicación. Error: Se produjeron uno o más errores. (No se puede abrir la base de datos" ... "solicitada por el inicio de sesión. El inicio de sesión falló. Iniciar sesión falló para el usuario '...' "
y
"No se puede crear un objeto de tipo 'MyContext'. Agregue una implementación de 'IDesignTimeDbContextFactory' al proyecto, o consulte https://go.microsoft.com/fwlink/?linkid=851728 para obtener patrones adicionales admitidos en tiempo de diseño".
El comando que ejecuté anteriormente fue $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(del proyecto / carpeta con DBContext).
Cadena de conexión: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
Este es mi Program.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();
}
Respuestas:
Puede agregar una clase que implemente IDesignTimeDbContextFactory dentro de su proyecto web.
Aquí está el código de ejemplo:
Luego, navegue hasta su proyecto de base de datos y ejecute lo siguiente desde la línea de comando:
recurso
fuente
No es necesario
IDesignTimeDbContextFactory
.correr
add-migration initial -verbose
que revelará los detalles debajo
advertencia, que es la causa raíz del problema.
En mi caso , el problema fue tener
ApplicationRole : IdentityRole<int>
e invocar loservices.AddIdentity<ApplicationUser, IdentityRole>()
que estaba causando el siguiente errorfuente
Solución 1: (Encuentre el problema en el 99% de los casos)
Establecer proyecto de aplicación web como proyecto de inicio
Ejecute los siguientes comandos con la
-verbose
opción.Solución 2:
Cambie el nombre
BuildWebHost()
aCreateWebHostBuilder()
, porqueEntity Framework Core tools
espere encontrar unCreateHostBuilder
método que configure el host sin ejecutar la aplicación..NET Core 2.2
.NET Core 3.1
Cambiar nombre
BuildWebHost()
aCreateHostBuilder()
Solución 3:
Asegúrese de haber agregado
Dbcontext
a la inyección de dependencia:AddDbContext<TContext>
hará que tanto su tipo DbContextTContext
, como el correspondienteDbContextOptions<TContext>
estén disponibles para la inyección desde el contenedor de servicios. Esto requiere agregar un argumento de constructor a suDbContext
tipo que aceptaDbContextOptions<TContext>
.Ejemplo: en Startup.cs
Código de AppDbContext :
fuente
public static IWebHostBuilder BuildWebHost(string[] args)
apublic static IWebHost BuildWebHost(string[] args)
con la.Build()
ahora incluida en la funciónIDesignTimeDbContextFactory
Simplemente cambie el nombre
BuildWebHost()
aCreateWebHostBuilder()
, porque las migraciones usan este método de forma predeterminada.fuente
En mi caso, la causa del problema fueron varios proyectos de inicio. Tengo tres proyectos en mi solución: Mvc, Api y Dal. DbContext y Migraciones en el proyecto Dal.
Había configurado varios proyectos de inicio. Los proyectos Mvc y Api se estaban ejecutando cuando hice clic en Iniciar. Pero en este caso recibí este error.
Pude agregar la migración con éxito después de configurar Mvc como el único proyecto de inicio y seleccionar Dal en la Consola del Administrador de paquetes.
fuente
En AppContext.cs además de la clase AppContext agregue otra clase:
Esto resolverá su segundo problema:
Después de eso, podrá agregar la migración inicial y ejecutarla ejecutando el comando update-database . Sin embargo, si ejecuta estos comandos cuando aún no hay una base de datos en su SqlServer local, recibirá una advertencia como su primer error: "Un error
Pero no es un error porque se creará la migración y se podrá ejecutar. Así que simplemente ignore este error por primera vez, y luego, dado que Db existirá, no volverá a suceder.
fuente
por favor verifique que tiene la referencia
fuente
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
que incluye esa referencia. Intenté también incluir lo anterior, pero sin cambios.Puede probar esta solución de esta discusión , que se inspiró en esta publicación .
fuente
Algo que realmente me ayudó fue 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 1 a 2, toda la inicialización de db se debe mover fuera de StartUp.cs y en Program.cs. De lo contrario, las tareas de EF intentan ejecutar sus inicios de base de datos cuando realizan tareas.
"Hay una buena sección en los documentos oficiales de migración ( https://docs.microsoft.com/en-us/ef/core/misiverse/1x-2x-upgrade ) titulada" Mover el código de inicialización de la base de datos "que parecía tener así que antes de que te dirijas a cualquier agujero de conejo, como lo hice, asegúrate de que esto no sea lo que está causando tu necesidad de agregar una implementación de IdesignTimeDbContextFactory ".
fuente
De
https://docs.microsoft.com/en-us/ef/core/miscela/cli/dbcontext-creation
Agregar Factory en .Net Core 2.x
fuente
Tuve este problema y esto resuelto por Set -> Aplicación web (Program.cs incluido) Proyecto a -> "Establecer como proyecto de inicio"
Luego ejecute -> add-migration initial -verbose
en la consola del administrador de paquetes
Establecer como proyecto de inicio
fuente
Si desea evitar esas cosas de IDesignTimeDbContextFactory: solo asegúrese de no usar ningún método Seed en su inicio. Estaba usando un método de semilla estática en mi inicio y me estaba causando este error.
fuente
Previamente, configuró los datos semilla en el método Configure en Startup.cs. Ahora se recomienda que utilice el método Configure solo para configurar la canalización de solicitudes. El código de inicio de la aplicación pertenece al método Main.
El método Main refactorizado. Agregue las siguientes referencias a Program.cs:
utilizando Microsoft.Extensions.DependencyInjection;
usando MyProject.MyDbContextFolder;
fuente
Hay un problema con ef seeding db desde Startup.Configure en 2.0 ... todavía puede hacerlo con esta solución. Probado y trabajado bien
https://garywoodfine.com/how-to-seed-your-ef-core-database/
fuente
En mi caso, tuve el problema porque tenía un método llamado SeedData.EnsurePopulated () en mi archivo Startup.cs .
El trabajo de la clase SeedData es agregar datos iniciales a la tabla de la base de datos. Su código es:
SOLUCIÓN
Antes de realizar la migración, simplemente comente la llamada de la clase SeedData en el archivo Startup.cs.
Eso resolvió mi problema y espero que su problema también se resuelva de la misma manera.
fuente
Me encontré con el mismo problema. Tengo dos proyectos en la solución. cual
Inicialmente, el proyecto de API se estableció como proyecto de inicio.
Cambié el proyecto de inicio por uno que contiene clases de contexto. si está utilizando Visual Studio , puede establecer un proyecto como proyecto de inicio mediante:
fuente
En primer lugar, asegúrese de haber configurado su base de datos en
Startup.cs
En mi caso, recibí este error ya que no especifiqué lo siguiente enStartup.cs
fuente
Usando ASP.NET Core 3.1 y EntityFrameWorkCore 3.1.0. Anulando el OnConfiguring de la clase de contexto con un constructor sin parámetros solamente
fuente
Estaba enfrentando el error
"No se puede crear un objeto de tipo 'MyContext'. Agregue una implementación de 'IDesignTimeDbContextFactory' al proyecto, o consulte https://go.microsoft.com/fwlink/?linkid=851728 para obtener patrones adicionales admitidos en tiempo de diseño".
Así fue como se resolvió mi problema. Ejecute el siguiente comando mientras se encuentra en el directorio de su solución
Aquí la aplicación es mi proyecto de inicio que contiene la clase Startup.cs y la infraestructura es mi proyecto que contiene la clase DbContext.
luego ejecute la actualización usando la misma estructura.
fuente
Tengo el mismo problema porque me estaba refiriendo a Microsoft.EntityFrameworkCore.Tools.DotNet antiguo
Después de actualizar a la versión más nueva, se resolvió
fuente
En el archivo appsettings.json del proyecto principal, había configurado 'Copiar al directorio de salida' en "Copiar siempre" y funcionó.
fuente
Ejemplo de clase de contexto de base de datos para aplicaciones de consola central .net
fuente
También puede usar en el constructor de la clase de inicio para agregar el archivo json (donde se encuentra la cadena de conexión) a la configuración. Ejemplo:
fuente
Para mí fue porque cambié el
Output Type
de mi proyecto de inicio deConsole Application
aClass Library
.Revertir a
Console Application
hizo el truco.fuente
Tuve este problema en una solución que tiene:
Recibo el mensaje "No se puede crear un objeto ..." cuando el proyecto Blazor está configurado como proyecto de inicio, pero no si el proyecto MVC está configurado como proyecto de inicio.
Eso me desconcierta, porque en la Consola del Administrador de paquetes (que es donde estoy creando la migración) tengo el proyecto predeterminado configurado en una biblioteca de clases C # que realmente contiene el contexto de la base de datos, y también estoy especificando el contexto de la base de datos en mi llamado a agregar migración
add-migration MigrationName -context ContextName
, por lo que parece extraño que a Visual Studio le importe qué proyecto de inicio está configurado actualmente.Supongo que la razón es que cuando el proyecto Blazor es el proyecto de inicio, el PMC determina que la versión de .NET es Core 3.0 desde el proyecto de inicio y luego intenta usarla para ejecutar las migraciones en la clase .NET Standard 2.0. biblioteca y golpear un conflicto de algún tipo.
Cualquiera que sea la causa, cambiar el proyecto de inicio al proyecto MVC que apunta a Core 2.2, en lugar del proyecto Blazor, solucionó el problema
fuente
Para mí, el problema era que estaba ejecutando los comandos de migración dentro del proyecto equivocado. Ejecutar los comandos dentro del proyecto que contenía Startup.cs en lugar del proyecto que contenía DbContext me permitió superar este problema en particular.
fuente
En mi caso, la configuración del proyecto StartUp en init ayuda. Puede hacer esto ejecutando
fuente
Tuve el mismo problema. Acabo de cambiar ap.jason a application.jason y solucionó el problema
fuente