Questo è il mio dbcontext:
public class ShoppingDbContext : IdentityDbContext<User>
{
public ShoppingDbContext(DbContextOptions options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
public DbSet<Product> Products { get; set; }
}
oggi ho ricevuto un errore che ho risolto inserendo il costruttore che vedi nel mio codice. Quello che accetta DbContextOptions come parametro. Ma ora quando voglio creare un'istanza di questo dbcontext non so cosa mettere in quel parametro:
public static async Task<List<Product>> GetAllProducts()
{
//what should go in here?
ShoppingDbContext db = new ShoppingDbContext(?????????????);
return await db.Products.ToListAsync();
}
se creo un costruttore di overload che richiede 0 parametri, non risolverà il problema, perché mi darebbe lo stesso errore che avevo prima di creare il costruttore con il parametro DbContextOptions. L'errore che ottengo se ho un costruttore con 0 parametri in dbcontext è questo:
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.
Devi impostarlo all'interno di Startup.cs
come mostrato di seguito.
public void ConfigureServices(IServiceCollection services)
{
var connection = @"Server=(localdb)\mssqllocaldb;Database=MyDb;Trusted_Connection=True;";
services.AddDbContext<ShoppingDbContext>(options => options.UseSqlServer(connection));
}
Dopodiché è necessario inject
nel Controller
come mostrato di seguito.
public class MyController : Controller
{
private ShoppingDbContext _context;
public MyController(ShoppingDbContext context)
{
_context = context;
}
}
Quindi il tuo metodo è come questo:
public static async Task<List<Product>> GetAllProducts()
{
return await _context .Products.ToListAsync();
}
Nel mio caso, voglio istanziare un nuovo contesto nella mia classe DbFactory senza DI :
public class DbFactory: Disposable, IDbFactory
{
BlogContext dbContext;
public BlogContext Init()
{
return dbContext ?? (dbContext = new BlogContext( NEEDOPTIONS ));
}
protected override void DisposeCore()
{
if (dbContext != null)
dbContext.Dispose();
}
}
Ho provato ad aggiungere una nuova opzione Builder , configurarlo e passarlo, ma ci deve essere un modo migliore.