Как создать экземпляр DbContext в EF Core

У меня есть настройки основного проекта .net и контекста БД. Но я не могу начать использовать dbContext еще из-за этого error-

"нет аргумента, соответствующего необходимому формальному параметру" options ""

контроллер:

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

    }
    return View();
}

Dbcontext Code:

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; }

}

изображение ошибки прилагается. Как можно исправить эту проблему? заранее спасибо

pic

Ответы

Ответ 1

В EF Core обычно передают некоторые DbContextOptions конструктору.

В общем, конструктор выглядит так:

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

Как вы можете видеть, нет допустимой перегрузки в виде конструктора без параметров:

Таким образом, это не работает:

using (var db = new BlexzWebDb())

Вместо


В .Net Core реализован IoC. Хорошо, это значит; вы не создаете контекст, вы просите инфраструктуру предоставить его на основе некоторых правил, которые вы определили ранее.

Пример: где-то вы зарегистрируете свой 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

Теперь регистрация завершена, вы можете получить свой контекст из фреймворка. Например: инверсия управления через конструктор в вашем контроллере:

public class SomeController : Controller
{
    private readonly BlexzWebDb _db;

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

    //etc.


обновление

В наши дни предпочтительным способом добавления DbContext в коллекцию сервисов является использование метода AddDbContextPool:

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

//etc

для получения дополнительной информации см. msdn

Ответ 2

Создание нового объекта DbContext из ConnectionString

var connectionstring = "Connection string";

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


ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);

// Or you can instantiate inside using

using(ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options))
{
   //...do stuff
}

Ответ 3

В дополнение к ответу @Stefan есть еще один способ добиться этого. Вы можете установить строку подключения к базе данных в методе OnConfiguring класса DbContext без добавления службы DbContext в файле 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.