هوية Asp.Net - IdentityDbContext<TUser> مما يسبب مشاكل في الحقول المضافة إلى جدول AspNetRoles

StackOverflow https://stackoverflow.com//questions/22051140

سؤال

IdentityDbContext يسبب مشاكل في الخصائص/الحقول المضافة إلى AspNetRoles

أعتقد أن المشكلة تكمن هنا في أن IdentityDbContext يأخذ نوع IdentityUser:

public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
    public IdentityDb()
        : base("IdentityDb")
    {
    }
}

ولكن اسمحوا لي أن أشرح…

من الرائع أن نتمكن من إضافة حقول إلى جدول AspNetUsers عن طريق إضافة خصائص إلى فئة ApplicationUser الخاصة بنا والتي ترث من IdentityUser.مثال:

public class ApplicationUser : IdentityUser
    {
        [Required]
        [StringLength(50)]
        public string FirstName { get; set; }

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

من الطبيعي جدًا أن نتمكن من إضافة حقول إلى جدول AspNetRoles عن طريق إضافة خصائص إلى فئة ApplicationRole التي ترث من IdentityRole.مثال:

public class ApplicationRole : IdentityRole
{
    [Required]
    [StringLength(50)]
    public string ProperName { get; set; }
}

يعمل بشكل مثالي.يمكننا أن نرى الحقل في قاعدة البيانات.يمكننا إضافة البيانات إليها.مثال:

RoleManager<ApplicationRole> roleManager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new MyIdentityDb()));

var role = new ApplicationRole() { Name = name, ProperName = propername };
var result = await roleManager.CreateAsync(role);

لكننا الآن نواجه مشكلة عند محاولة الوصول إلى البيانات.مثال:

نموذج العرض الخاص بنا:

public class IndexViewModel
{
    public IList<ApplicationUser> Users { get; set; }
    public IList<ApplicationRole> Roles { get; set; }
}

على وحدة التحكم لدينا:

private MyIdentityDb myIdentityDb = new MyIdentityDb();

طريقة الفهرس الخاصة بنا على وحدة التحكم الخاصة بنا:

public ViewResult Index(int? page)
{
     return View(new IndexViewModel
     {
          Users = myIdentityDb.Users.ToList(),
          Roles = myIdentityDb.Roles.ToList()
     });
}

الخطأ موجود في "myIdentityDb.Roles.ToList()" ويقرأ "لا يمكن تحويل النوع ضمنيًا System.Collection.Generic.List<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> to System.Collections.Generic.IList<MyApp.Models.ApplicationRole>

بالطبع يمكننا تغيير ViewModel الخاص بنا لاستخدام نوع IdentityRole مثل المثال التالي، ولكن بعد ذلك لا يمكننا الوصول إلى حقل "ProperName" الجديد في جدول AspNetRoles:

public class IndexViewModel
{
    public IList<ApplicationUser> Users { get; set; }
    public IList<IdentityRole> Roles { get; set; }
}

لذا يمكننا محاولة إنشاء فئة Db أخرى وتمرير نوع IdentityRole بدلاً من IdentityUser:

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

public class MyIdentityRolesDb : IdentityDbContext<ApplicationRole>
{
    public MyIdentityRolesDb()
        : base("MyIdentityDb")
    {
    }
}

وتغيير وحدة التحكم لدينا:

private MyIdentityDb myIdentityDb = new MyIdentityDb();
private MyIdentityRolesDb myIdentityRolesDb = new MyIdentityRolesDb();

وقم بتغيير طريقة الفهرس الخاصة بنا على وحدة التحكم الخاصة بنا:

public ViewResult Index(int? page)
{
     return View(new IndexViewModel
     {
          Users = myIdentityDb.Users.ToList(),
          Roles = myIdentityRolesDb.Roles.ToList()
     });
}

ولكننا في نهاية المطاف نواجه نفس المشكلة؛حقيقة أن IdentityDbContext يأخذ نوع IdentityUser.

هل لديك أي أفكار حول كيفية الحصول على قائمة بالأدوار باستخدام الحقول/الخصائص المخصصة؟

هل كانت مفيدة؟

المحلول

لذا، إذا قمت بالترقية إلى حزم بيتا 2.0.0، فمن المفترض أن تكون قادرًا على الحصول على IQueryable of ApplicationRole مباشرة من مدير الأدوار:

roleManager.Roles

لذلك لا يتعين عليك النزول إلى سياق قاعدة البيانات، فقد كان هذا قيدًا في الإصدار 1.0 تم إصلاحه في الإصدار 2.0.

نصائح أخرى

يرجى إلقاء نظرة على المقالة التالية التي تشرح بالتفصيل ما تحاول القيام به http://typecastexception.com/post/2014/02/13/ASPNET-MVC-5-Identity-Extending-and-Modifying-Roles.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top