Sto cercando di utilizzare gli strumenti di EF Core per gestire un database SqlServer che sto progettando in una libreria di classi C #. È in una libreria di classi perché ho bisogno di utilizzare lo schema del database sia in un sito Web MVC6 che in alcuni strumenti da riga di comando.
Ho dovuto convertire la libreria di classi in una netapp perché la versione corrente degli strumenti non supporta le librerie di classi, ma non penso che sia la fonte del mio problema.
La mia classe DbContext si presenta così:
public class ConnellDbContext : IdentityDbContext<ConnellUser>
{
public ConnellDbContext( DbContextOptions<ConnellDbContext> options )
{
}
// core tables
public DbSet<Ballot> Ballots { get; set; }
public DbSet<Campaign> Campaigns { get; set; }
//...
}
Quando eseguo "lista migrazioni dotnet ef" sulla console di Gestione pacchetti, viene visualizzato il seguente messaggio di errore:
Nessun costruttore senza parametri è stato trovato su "ConnellDbContext". Aggiungere un costruttore senza parametri a "ConnellDbContext" o aggiungere un'implementazione di "IDbContextFactory" nello stesso assembly di "ConnellDbContext".
Non sono abbastanza sicuro su come risolvere questo problema. È abbastanza facile inserire un costruttore senza parametri, ma quando lo faccio ottengo il seguente errore:
Nessun provider di database è stato configurato per questo DbContext. Un provider può essere configurato eseguendo l'override del metodo DbContext.OnConfiguring o utilizzando AddDbContext sul provider del servizio dell'applicazione. Se si utilizza AddDbContext, assicurarsi inoltre che il tipo DbContext accetti un oggetto DbContextOptions nel suo costruttore e lo passi al costruttore di base per DbContext.
Io >> penso << questo significa che i comandi della console non stanno raccogliendo le informazioni sulla stringa di connessione nel mio file appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-ConnellCampaigns;Trusted_Connection=True;MultipleActiveResultSets=true;AttachDbFilename=e:\\SqlServer\\Data\\ConnellCampaigns.mdf;"
}
}
Mi manca qualcosa su come gli strumenti EF accedono al codice sorgente per fare la sua magia. Qualsiasi suggerimento o guida sarebbe molto apprezzato.
Informazioni addizionali
Grazie a Mr. Anderson ho fatto dei progressi. Ho aggiunto un costruttore senza parametri e sovrascrivo il metodo OnConfiguring () nella mia classe DbContext:
protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
var builder = new ConfigurationBuilder()
.AddJsonFile( "appsettings.json", optional: true, reloadOnChange: true );
IConfigurationRoot config = builder.Build();
optionsBuilder.UseSqlServer(config.GetConnectionString("DefaultConnection") );
}
Non funzionava, ma includeva esplicitamente la stringa di connessione effettiva nella chiamata a UseSqlServer (). Pensieri sul perché la chiamata basata su "DefaultConnection" non ha funzionato?
public class ConnellDbContext : IdentityDbContext<ConnellUser>
{
internal static string connection_string
{
get
{
return System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
}
}
public ConnellDbContext() : base(connection_string)
{
}
// core tables
public DbSet<Ballot> Ballots { get; set; }
public DbSet<Campaign> Campaigns { get; set; }
//...
}