J'ai la classe suivante dans NET Core2.0 App.
// required when local database does not exist or was 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);
}
}
Cela est nécessaire en Core 2.0 avec la migration de la Base de données n'existe pas et doit être créé lorsque vous exécutez la mise à jour de la base de données.
Impossible de créer des migrations après la mise à jour ASP.NET Core 2.0
Je voudrais ne pas avoir ConnectionString dans 2 endroits(ici et dans appsettings.json), mais uniquement dans .json j'ai donc essayé de remplacer
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
avec
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
mais cela ne fonctionne pas, j'obtiens une valeur null.
Mise à JOUR 1:
Juste à noter que l'ajout de façon explicite .json n'est pas necessery en Base 2 de sorte que le problème n'est pas avec le fichier.
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
Mise à JOUR 2:
Aussi, je suis déjà à l'aide de Configuration pour l'envoi de ConnectionString de .json au Contexte:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
Mais je ne peux pas l'utiliser pour ToDoContextFactory car il n'a pas de Configuration, et ToDoContextFactory est utilisé par les migrations ainsi, l'Application ne fonctionne pas du tout.
SOLUTION: Basé sur la réponse de @JUR je l'ai fait travailler comme ceci:
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}