Как создать DbContext в EF Core - PullRequest
0 голосов
/ 11 июня 2018

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

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

Контроллер:

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

    }
    return View();
}

Код 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; }

}

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

pic

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

В дополнение к ответу @ Stefan есть еще один способ добиться этого.Вы можете установить строку подключения к базе данных в методе OnConfiguring класса DbContext без добавления службы DbContext в файле startup.cs.

Setting.cs

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

Запуск.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.
0 голосов
/ 08 апреля 2019

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

var connectionstring = "Connection string";

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

ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);
0 голосов
/ 11 июня 2018

В 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.


update

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

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

//etc

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

...