web-dev-qa-db-fra.com

Comment instancier un DbContext dans EF Core

J'ai également installé le projet de base .net et le contexte de base de données. Mais je ne peux pas encore utiliser dbContext à cause de cette erreur.

"il n'y a aucun argument donné qui correspond au paramètre formel requis 'options'"

Manette:

public IActionResult Index()
{
    using (var db = new BlexzWebDb())
    {

    }
    return View();
}

Code DbContext:

public class BlexzWebDb : DbContext
{
    public BlexzWebDb(DbContextOptions<BlexzWebDb> options)
       : base(options)
    { }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<AssignedRole> AssignedRoles { get; set; }

}

image d'erreur jointe. Quelle est la solution possible à ce problème? Merci d'avance

pic

15
john Cogdle

Dans EF Core, il est courant de transmettre certaines options DbContextOptions au constructeur.

Donc en général, un constructeur ressemble à ceci:

public BlexzWebDb(DbContextOptions<BlexzWebDb> options) : base(options)

Comme vous pouvez le constater, il n'y a pas de surcharge valide sous la forme d'un constructeur sans paramètre:

Ainsi, cela ne fonctionne pas:

using (var db = new BlexzWebDb())

Au lieu de cela


Exemple: quelque part, vous enregistrerez votre dbcontext, (Startup.cs):

//typical configuration part of .net core
public void ConfigureServices(IServiceCollection services)
{
    //some mvc 
    services.AddMvc();

    //hey, options! 
    services.AddDbContextPool<BlexzWebDb>(options => 
           options.UseSqlServer(Configuration.GetConnectionString("BlexzWebConnection")));
    //...etc

Maintenant que la partie enregistrement est terminée, vous pouvez extraire votre contexte du framework. Exemple: inversion du contrôle via un constructeur dans votre contrôleur:

public class SomeController : Controller
{
    private readonly BlexzWebDb _db;

    //the framework handles this
    public SomeController(BlexzWebDb db)
    {
        _db = db;
    }

    //etc.

mise à jour

De nos jours, la méthode préférée pour ajouter un DbContext à la collection de services consiste à utiliser la méthode AddDbContextPool:

//hey, options!
//hey, DbContextPool
services.AddDbContextPool<BlexzWebDb>(options => 
       options.UseSqlServer(Configuration.GetConnectionString("BlexzWebConnection")));

//etc

pour plus d'informations, voir msdn

28
Stefan

Instancier le nouvel objet de DbContext à partir de ConnectionString

var connectionstring = "Connection string";

var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
            optionsBuilder.UseSqlServer(connectionstring);

ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);
18
Qamar Zaman

En plus de la réponse de @ Stefan, il existe un autre moyen d'y parvenir. Vous pouvez définir une chaîne de connexion à la base de données dans la méthode OnConfiguring de la classe DbContext sans ajouter le service DbContext dans startup.cs.

Setting.cs

public static class Setting
{
    public static string ConnectionString { get; set; }
}

Startup.cs

Setting.ConnectionString = Configuration.GetSection("ConnectionStrings:BlexzDbConnection").Value;

BlexzWebDb.cs

public class BlexzWebDb : DbContext 
{
   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
       if (!optionsBuilder.IsConfigured)
       {
           optionsBuilder.UseSqlServer(Setting.ConnectionString);
       }
    }
}

HomeController.cs

public class HomeController : Controller
{
    private readonly BlexzWebDb db;

    public HomeController()
    {
        this.db = new BlexzWebDb();
    }

    //etc.
16
hasan