如何在EF Core中实例化DbContext

时间:2018-06-10 21:36:43

标签: c# asp.net-core .net-core entity-framework-core

我也设置了.net核心项目和db上下文。但由于此错误 -

,我无法开始使用dbContext
  

"没有任何论据符合所要求的形式   参数'选项'"

控制器:

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

4 个答案:

答案 0 :(得分:21)

在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

答案 1 :(得分:10)

除了@Stefan的回答之外,还有另一种方法可以实现这一目标。您可以在DbContext类的OnConfiguring方法中设置db连接字符串,而无需在startup.cs中添加DbContext服务。

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

答案 2 :(得分:5)

实例化DbContext的新对象

var connectionstring = "Connection string";

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

ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);

答案 3 :(得分:3)

EF Core 3.1的代码示例:

public class Test
{
    private readonly IServiceProvider _serviceProvider;

    public Test(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public async Task<RequestResult> Handle(...)
    {
        await using var context = CreateContext();
        ...
    }

    private DocumentContext CreateContext()
    {
        var options = _serviceProvider.GetService<IOptions<DocumentContextOptions>>();
        return new DocumentContext(options);
    }
}