شرح - ASP.NET الارتباك DbContext الهوية




mvc 5 شرح (3)

يأتي تطبيق 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 ، لنفترض على سبيل المثال لنموذج حيواني ، فإن هذا الخط الجديد سيحصل على autogenerated مباشرة تحت public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; } public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; } 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 (لكافة الأشياء DbContext ASP.NET) من IdentityDbContext الذي يرث بدوره من DbContext . AllOtherStuffDbContext (من أجل الأشياء الخاصة بي) من DbContext .

لذلك سؤالي هو:

أي من هذين الاثنين ( ApplicationDbContext و AllOtherStuffDbContext ) يجب أن أستخدمه لكافة الطُرز الخاصة بي الأخرى؟ أو يجب فقط استخدام الافتراضي ApplicationDbContext autogenerated لأنه لا يجب أن يكون مشكلة في استخدامه لأنه مشتق من فئة الأساس DbContext ، أو سيكون هناك بعض الحمل؟ يجب عليك استخدام كائن DbContext واحد فقط في تطبيقك لجميع النماذج الخاصة بك (لقد قرأت هذا في مكان ما) لذلك لا ينبغي حتى النظر في استخدام كل من ApplicationDbContext و AllOtherStuffDbContext في تطبيق واحد؟ أو ما هو أفضل الممارسات في MVC 5 مع هوية ASP.NET؟


إذا قمت بالانتقال من خلال تجريد IdentityDbContext ستجد أنه يبدو تماماً مثل DbContext المشتقة الخاص بك. أسهل طريقة هي إجابة أولاف ، ولكن إذا كنت تريد المزيد من التحكم في ما يتم إنشاؤه ، فإن الاعتماد قليلاً على حزم الهوية قد ألق نظرة على سؤالي والإجابة عليه هنا . هناك مثال التعليمات البرمجية إذا قمت باتباع الارتباط ، ولكن في ملخص تقوم فقط بإضافة DbSets المطلوبة إلى فئة فرعية DbContext الخاصة بك.


هذا هو دخول متأخر للناس ، ولكن أدناه هو تنفيذي. ستلاحظ أيضًا أنني قمت بإدراجه القدرة على تغيير نوع KEYs الافتراضي: التفاصيل حول التي يمكن العثور عليها في المقالات التالية:

ملاحظات:
تجدر الإشارة إلى أنه لا يمكنك استخدام Guid's . ويرجع ذلك إلى أنه تحت غطاء المحرك ، فهي عبارة عن Struct ، وعلى هذا النحو ، لا تحتوي على <TKey> مما يسمح <TKey> معلمة <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
    }

يمكنني استخدام فئة سياق مفرد ترث من IdentityDbContext. بهذه الطريقة يمكن أن يكون السياق على علم بأي علاقات بين الفئات الخاصة بك و IdentityUser والأدوار في IdentityDbContext. يوجد مقدار حمل قليل جداً في IdentityDbContext ، وهو في الأساس DbContext عادي مع اثنين من DbSets. واحد للمستخدمين وواحد للأدوار.







asp.net-identity