Tengo un proyecto central de asp.net 'Api' con objetivo:
<TargetFramework>net471</TargetFramework>
Ese proyecto hace referencia a otro proyecto de biblioteca de clases 'Repositorio' con destino:
<TargetFramework>netstandard1.4</TargetFramework>
El proyecto 'Api' tiene esto configurado:
services
.AddEntityFrameworkSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("Repository"))
)
.AddScoped(p => new ApplicationDbContext(p.GetService<DbContextOptions<ApplicationDbContext>>()));
Cuando estoy en la PMConsole entro:
Add-Migración inicial
entonces me sale este error:
Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
add-migration : Exception calling "Substring" with "1" argument(s): "StartIndex cannot be less than zero.
Parameter name: startIndex"
At line:1 char:1
+ add-migration
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Migration], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentOutOfRangeException,Add-Migration
¿En qué me equivoco?
Los comandos de EF Core solo funcionan para proyectos de inicio, es decir, algo que realmente puede ejecutarse , a diferencia de una biblioteca de clases. Esto se debe a que el contexto se crea a través de la inyección de dependencia, que solo puede ocurrir durante el tiempo de ejecución. Una solución alternativa es crear una implementación de IDesignTimeDbContextFactory
en su biblioteca de clases. Cuando los comandos vean su implementación, esa fábrica se usará para crear una instancia del contexto.
public class MyContextFactory : IDesignTimeDbContextFactory<MyContext>
{
public MyContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlServer("[connection string here]");
return new MyContext(optionsBuilder.Options);
}
}
Para más información, consulte la documentación .