web-dev-qa-db-ja.com

EF CoreでDbContextをインスタンス化する方法

セットアップ.netコアプロジェクトとdbコンテキストもあります。しかし、このエラーのために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

15
john Cogdle

EF Coreでは、いくつかのDbContextOptionsをコンストラクターに渡すのが一般的です。

したがって、一般的に、コンストラクターは次のようになります。

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

ご覧のとおり、パラメーターなしのコンストラクターという形式の有効なオーバーロードはありません。

したがって、これは機能しません:

using (var db = new BlexzWebDb())

代わりに


例: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 を参照してください

28
Stefan

ConnectionStringからDbContextの新しいオブジェクトをインスタンス化します

var connectionstring = "Connection string";

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

ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);
18
Qamar Zaman

@Stefanの答えに加えて、これを達成する別の方法があります。 startup.csにDbContextサービスを追加せずに、DbContextクラスのOnConfiguringメソッドでdb接続文字列を設定できます。

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.
16
hasan