J'ai un projet principal asp.net 'Api' avec la cible:
<TargetFramework>net471</TargetFramework>
Ce projet fait référence à un autre projet de bibliothèque de classes 'Repository' avec target:
<TargetFramework>netstandard1.4</TargetFramework>
Le projet 'Api' a ceci configuré:
services
.AddEntityFrameworkSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("Repository"))
)
.AddScoped(p => new ApplicationDbContext(p.GetService<DbContextOptions<ApplicationDbContext>>()));
Quand je suis dans la PMConsole j'entre:
Add-Migration Initial
alors j'obtiens cette erreur:
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
Qu'est-ce que je me trompe?
Les commandes EF Core ne fonctionnent que pour les projets de démarrage, c'est-à-dire quelque chose qui peut réellement s'exécuter , par opposition à une bibliothèque de classes. En effet, le contexte est créé via une injection de dépendance, qui ne peut avoir lieu que pendant l'exécution. Une solution de contournement consiste à créer une implémentation de IDesignTimeDbContextFactory
dans votre bibliothèque de classes. Lorsque les commandes voient votre implémentation, cette fabrique sera ensuite utilisée pour instancier le contexte.
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);
}
}
Pour plus d'informations, voir la documentation .