207

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

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

Entity Framework でビューを使用して新しいコントローラーをスキャフォールディングし、ダイアログで「新しいデータ コンテキスト...」を作成すると、次のように生成されます。

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がありますか、それともオーバーヘッドが発生しますか? すべてのモデルに対してアプリで1 つのオブジェクトのみを使用する必要がありますDbContext(これはどこかで読んだことがあります) 。または、ASP.NET Identity を使用した MVC 5 のベスト プラクティスは何ですか?ApplicationDbContextAllOtherStuffDbContext

4

4 に答える 4

189

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

于 2013-11-11T10:30:00.243 に答える
9

これは人々にとっては遅いエントリですが、以下は私の実装です。また、キーのデフォルト タイプを変更する機能をスタブアウトしたことにも気付くでしょう。詳細については、次の記事を参照してください。

注:キーに
は使用できないことに注意してください。Guid'sこれは、Struct内部的には であり、ジェネリック<TKey>パラメーターからの変換を可能にするボックス化解除がないためです。

クラスは次のようになります。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, string, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    #region <Constructors>

    public ApplicationDbContext() : base(Settings.ConnectionString.Database.AdministrativeAccess)
    {
    }

    #endregion

    #region <Properties>

    //public DbSet<Case> Case { get; set; }

    #endregion

    #region <Methods>

    #region

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //modelBuilder.Configurations.Add(new ResourceConfiguration());
        //modelBuilder.Configurations.Add(new OperationsToRolesConfiguration());
    }

    #endregion

    #region

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    #endregion

    #endregion
}

    public class ApplicationUser : IdentityUser<string, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        #region <Constructors>

        public ApplicationUser()
        {
            Init();
        }

        #endregion

        #region <Properties>

        [Required]
        [StringLength(250)]
        public string FirstName { get; set; }

        [Required]
        [StringLength(250)]
        public string LastName { get; set; }

        #endregion

        #region <Methods>

        #region private

        private void Init()
        {
            Id = Guid.Empty.ToString();
        }

        #endregion

        #region public

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, string> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

            // Add custom user claims here

            return userIdentity;
        }

        #endregion

        #endregion
    }

    public class CustomUserStore : UserStore<ApplicationUser, CustomRole, string, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        #region <Constructors>

        public CustomUserStore(ApplicationDbContext context) : base(context)
        {
        }

        #endregion
    }

    public class CustomUserRole : IdentityUserRole<string>
    {
    }

    public class CustomUserLogin : IdentityUserLogin<string>
    {
    }

    public class CustomUserClaim : IdentityUserClaim<string> 
    { 
    }

    public class CustomRoleStore : RoleStore<CustomRole, string, CustomUserRole>
    {
        #region <Constructors>

        public CustomRoleStore(ApplicationDbContext context) : base(context)
        {
        } 

        #endregion
    }

    public class CustomRole : IdentityRole<string, CustomUserRole>
    {
        #region <Constructors>

        public CustomRole() { }
        public CustomRole(string name) 
        { 
            Name = name; 
        }

        #endregion
    }
于 2015-06-18T01:17:54.437 に答える