Voglio selezionare i dati dalla mia tabella "Intestazione" utilizzando un semplice comando LINQ ma ho riscontrato errori.
La mia azione
public HeaderModel GetHeaderInformation()
{
using(var context = new ApplicationDbContext())
{
var header = context.Headers.Select(x => new HeaderModel
{
colorCode = x.colorCode,
height = x.height,
Id = x.Id,
left = x.left,
top = x.top,
width = x.width
}).FirstOrDefault();
return header;
}
}
L'errore
Ulteriori informazioni: 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.
Il mio ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public ApplicationDbContext() : base() { }
public DbSet<Header> Headers { get; set; }
public DbSet<Menu> Menus { get; set; }
}
My Startup.cs
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddApplicationInsightsTelemetry(Configuration);
services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
services.AddMvc();
Grazie in anticipo.
Stai usando un'iniezione di dipendenza. services.AddDbContext
è responsabile della creazione di un oggetto DbContext. Non ha senso avere quel blocco usando perché, così facendo, stai istanziando un nuovo ApplicationDbContext che non ha una stringa di connessione.
Scrivi il tuo metodo in questo modo:
public HeaderModel GetHeaderInformation(ApplicationDbContext context)
{
// the code inside your using block
}
e .Net risolverà il contesto tramite l'integrazione delle dipendenze.
Inoltre, una pratica comune è quella di avere DbContext come un readonly privato assegnato alla classe del costruttore. Quindi potresti voler fare qualcosa del genere:
public class MyConroller : Controller
{
private readonly MyDbContext _context;
public MyConroller(MyDbContext ctx)
{
_context = ctx;
}
}
e usa semplicemente il contesto attribuito ai tuoi metodi.
Dovresti rimuovere il tuo costruttore senza parametri, perché probabilmente è quello che viene chiamato quando una DI nuova crea una nuova istanza. So che per alcune persone questo era il problema, spero che aiuti.