Как создать экземпляр 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; }
}
изображение ошибки прилагается. Как можно исправить эту проблему? заранее спасибо
Ответы
Ответ 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.