首页 > 解决方案 > 如何有条件地将多个模型映射到 ASP.NET Core Identity 中的一个表(AspNetUsers)?

问题描述

我正在 ASP.NET Core MVC 中创建一个学习评估 Web 应用程序。我计划拥有两个独立的数据库:一个用于使用 Identity Framework 的用户,另一个用于使用 Dapper 的数据。但是,我的模型与我的用户(InstructorStudent)有关系。这是我绘制的显示关系的实体关系图:

实体关系图 例如,我必须Course为每个Student实例包含一个导航属性。同样,TestInstance包含Instructor和的导航属性Student,明确区分了两个用户类。我还需要另一个名为的用户类Administrator

用户类 责任
Student 参加考试
Instructor 创建和安排测试
Administrator 管理教师和学生的帐户和课程。拥有导师的所有特权

我知道可以通过派生在 Identity 中创建自定义属性,IdentityUser但我需要维护三个不同的用户类,并且 Identity 只提供一个名为AspNetUsers. 我不想在我的域模型中直接使用 Identity 中的表。事实上,如果 Identity 可以拥有自己的独立数据库,那就太好了。管理员将是创建和管理教师和学生帐户的人。

我的问题是:

有什么方法可以创建三个模型/实体StudentInstructorAdminstrator作为我的域模型的一部分,然后让它们都使用身份AspNetUsers表中的 ID? 他们的角色信息可以存储为声明或AspNetUserRolesIdentity 提供的表中。

然后我可以使用 Identity 添加策略来实现访问控制。

我希望这不是设计缺陷。如果我的项目处于初始阶段,我仍然可以重新考虑设计。

标签: c#asp.net-coreentity-framework-coreasp.net-core-mvcasp.net-identity

解决方案


例如,您可以将 TPT 与 EF Core 5 一起使用,此项目将 TPT 与 ASP.NET Core Identity 集成。

https://github.com/ArminShoeibi/SchoolManagementSystem

 public class ApplicationUser : IdentityUser<Guid>
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string NationalCode { get; set; }
        public DateTime BirthDate { get; set; }
        public Gender Gender { get; set; }

    }

 public class Student : ApplicationUser
    {
        public string FatherName { get; set; }
        public string PlaceOfBirth { get; set; }
        public string Address { get; set; }
        public string HomePhoneNumber { get; set; }
    }

 public class Teacher : ApplicationUser
    {
        public string FieldOfStudy { get; set; }
        public AcademicDegree AcademicDegree{ get; set; }
        public int YearsOfExperience { get; set; }
    }


  public class SchoolMgmtContext : IdentityDbContext<ApplicationUser,ApplicationRole,Guid>
    {


        public SchoolMgmtContext(DbContextOptions<SchoolMgmtContext> dbContextOptions)
            :base(dbContextOptions)
        {

        }

        public DbSet<Teacher> Teachers { get; set; }
        public DbSet<Student> Students { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            builder.Entity<ApplicationUser>().ToTable("Users");
            builder.Entity<ApplicationRole>().ToTable("Roles");

            builder.Entity<Student>().ToTable("Students");
            builder.Entity<Teacher>().ToTable("Teachers");
         

        }
    }

结果是: 在此处输入图像描述


推荐阅读