Nella mia soluzione ho diversi progetti .NET Core 2.0:
In App.DataAccess.Migrations
(che voglio utilizzare come assembly di migrazione) ho una classe AppDbContextFactory
:
namespace App.DataAccess.Migrations
{
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;
public sealed class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
{
public AppDbContextFactory()
{
Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
}
public IConfiguration Configuration { get; }
public AppDbContext CreateDbContext(string[] args)
{
DbContextOptionsBuilder<AppDbContext> builder = new DbContextOptionsBuilder<AppDbContext>();
builder.UseSqlServer(
connectionString: Configuration.GetConnectionString("DefaultConnection"),
sqlServerOptionsAction: sqlOptions => sqlOptions.MigrationsAssembly(GetType().Namespace));
return new AppDbContext(builder.Options);
}
}
}
Nello stesso progetto, ho anche un file appsettings.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=.\\SQLEXPRESS;Initial Catalog=MyApp;User ID=sa;Password=SomethingSecret;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Nel mio progetto App.WebApi
, ho il seguente nella mia classe di Startup
:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(ConfigureDatabaseOptions);
services.AddMvc();
}
private void ConfigureDatabaseOptions(DbContextOptionsBuilder builder)
{
builder.UseSqlServer("DefaultConnection", ConfigureSqlServerDatabaseOptions);
}
private void ConfigureSqlServerDatabaseOptions(SqlServerDbContextOptionsBuilder builder)
{
builder.MigrationsAssembly(typeof(AppDbContextFactory).Namespace);
}
Nello stesso progetto, ho anche aggiunto la stringa di connessione a appsettings.json
.
Add-Migration funziona.
Update-Database genera questo errore:
System.ArgumentException: il formato della stringa di inizializzazione non è conforme alle specifiche a partire dall'indice 0.
Perché?
Risolto. Sto passando "DefaultConnection" come stringa di connessione invece del nome della stringa di connessione:
private void ConfigureDatabaseOptions(DbContextOptionsBuilder builder)
{
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), ConfigureSqlServerDatabaseOptions);
}
Il modo in cui ho potuto risolvere il problema era nel modo seguente, per capire la soluzione ho inserito il nome di una connessione fittizia. è la soluzione
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AuthenticDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnectionString")));
services.AddIdentity<AplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AuthenticDBContext>()
.AddDefaultTokenProviders();
services.AddMvc().AddJsonOptions(configureJson);
}