我也设置了.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; }
}
附上错误图片。是什么可能解决这个问题? 提前致谢
答案 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)
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);
}
}