web-dev-qa-db-ja.com

複数のDbContextを使用するEntity Frameworkコア

PartsDbContextのフィールドにアクセスしようとすると、次のエラーが発生するという問題があります。

System.Data.SqlClient.SqlException: '無効なオブジェクト名' fieldName '

これは、PartsDbContextにIdentityで使用されるApplicationDbContextと同じデータベースを使用させようとしているためだと思われます。別のデータベースを使用/作成するEFコアで動作するように、2番目のdbcontextをセットアップする方法を知る必要があります。

2番目の接続文字列を作成しようとしましたが、このエラーが発生します。

System.Data.SqlClient.SqlException: 'ログインで要求されたデータベース "PartsDb"を開けません。ログインに失敗しました。ユーザー「DESKTOP-4VPU567\higle」のログインに失敗しました。

私のコードは次のとおりです。

appsettings.json

_"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true",
    "PartsConnection":  "Server=(localdb)\\mssqllocaldb;Database=PartsDb"
},
"Logging": {
    "IncludeScopes": false,
    "LogLevel": {
        "Default": "Warning"
    }
}
_

PartsDbContext.cs

_public class PartsDbContext : DbContext
{
    public DbSet<PartsViewModels.Tower> Towers { get; set; }
    public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; }

    public PartsDbContext(DbContextOptions<PartsDbContext> options)
        : base(options)
    {
    }
}
_

Startup.cs

_public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddEntityFramework()
        .AddDbContext<PartsDbContext>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("PartsConnection")));

    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
    });

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}
_

AdminController.cs

_[Authorize(Policy = "RequireAdminRole")]
public class AdminController : Controller
{
    private readonly PartsDbContext _context;

    public AdminController(PartsDbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Towers()
    {
        var model = _context.Towers.ToList();
        return View(model);
    }
}
_

var model = _context.Towers.ToList();は、エラーが表示される場所です。

もう一度。 EF-Coreがデータベースを自動的に作成するように、Entity Framework Coreと連携するようにPartsDbContextをセットアップしたい。

20
Joe Higley

私はそれを考え出した。これは主に、Identityが使用しているデータベースを誤って削除してしまい、それを取り戻す方法を見つける必要があったために生じました。

どうやら私の接続文字列に問題はないようです。パッケージマネージャーに移動して、これらのコマンドを次の順序で入力する必要がありました。

  1. Add-Migration init -Context PartsDbContext
  2. Update-Database -Context PartsDbContext

これは、ApplicationDbContextを再び機能させるために必要なことであり、個々のユーザー認証を使用してVisual Studioで新しいMVCコアWebアプリケーションを作成すると、この手順が実行されることがわかったためです。

したがって、基本的にDbContextを追加する手順は次のとおりです。

  1. DbContextクラスを作成する
  2. appsettings.jsonでそのDbContextの接続文字列を作成します
  3. Startup.csで構成済みのサービスにDbContextを追加します
  4. DbContextを使用するコントローラーでセットアップします。
  5. パッケージマネージャーを開き、上記の2行を実行します。 (「-Context」が機能しない場合は、「-context」を試してください
  6. プログラムを実行し、EntityFrameworkCoreが残りを処理します。
22
Joe Higley