1. ホーム
  2. asp.net

[解決済み】ASP.NET Identity DbContextの混乱

2022-04-21 20:16:26

質問

デフォルトのMVC 5アプリには、IdentityModels.csに次のコード片が付属しています。このコード片は、デフォルトテンプレートのすべてのASP.NET Identity操作用です。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

Entity Frameworkでビューを使用して新しいコントローラをscaffoldし、ダイアログで"New data context..."を作成すると、次のようなものが生成されます。

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class AllTheOtherStuffDbContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx

        public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
        {
        }

        public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }

    }
} 

EFを使用して別のコントローラ+ビューを雛形化した場合、例えばAnimalモデルの場合、次の新しい行が直下に自動生成されます。 public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; } - このように

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class AllTheOtherStuffDbContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx

        public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
        {
        }

        public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
        public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }

    }
} 

ApplicationDbContext (すべての ASP.NET Identity に関するもの) は IdentityDbContext を継承し、さらに DbContext . AllOtherStuffDbContext (自作用) は DbContext .

そこで質問なのですが。

この2つのうち、どちらが( ApplicationDbContextAllOtherStuffDbContext ) は、他のすべての自作モデルに使用すべきでしょうか?それとも、デフォルトの自動生成された ApplicationDbContext の基本クラスから派生しているので、これを使っても問題はないはずです。 DbContext それとも、何らかのオーバーヘッドが発生するのでしょうか?使用すべきなのは DbContext オブジェクトの両方を使用することを検討すべきではないでしょう。 ApplicationDbContextAllOtherStuffDbContext を1つのアプリで使用できますか?または、ASP.NET Identityを使用したMVC 5のベストプラクティスは何ですか?

どのように解決するのですか?

私なら、IdentityDbContextを継承した単一のContextクラスを使用します。 こうすることで、IdentityDbContext の IdentityUser および Roles とあなたのクラスとの間の関係をコンテキストに認識させることができる。 IdentityDbContext にはほとんどオーバーヘッドがなく、基本的には通常の DbContext に 2 つの DbSet を加えたものです。1 つはユーザー用、もう 1 つはロール用です。