Ho un progetto di base asp.net 'Api' con obiettivo:
<TargetFramework>net471</TargetFramework>
Quel progetto fa riferimento a un altro progetto di libreria di classi "Repository" con target:
<TargetFramework>netstandard1.4</TargetFramework>
Il progetto 'Api' ha configurato questo:
services
.AddEntityFrameworkSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("Repository"))
)
.AddScoped(p => new ApplicationDbContext(p.GetService<DbContextOptions<ApplicationDbContext>>()));
Quando sono nella PMConsole, inserisco:
Aggiungi-Migrazione iniziale
allora ottengo questo errore:
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
Cosa ho sbagliato?
I comandi EF Core funzionano solo per i progetti di avvio, ovvero qualcosa che può essere effettivamente eseguito , al contrario di una libreria di classi. Questo perché il contesto viene creato tramite l'integrazione delle dipendenze, che può avvenire solo durante il runtime. Una soluzione alternativa consiste nel creare un'implementazione di IDesignTimeDbContextFactory
nella libreria di classi. Quando i comandi vedono la tua implementazione, quella fabbrica verrà quindi utilizzata per creare un'istanza del contesto.
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);
}
}
Per ulteriori informazioni, consultare la documentazione .