c# - 如何有条件地将多个模型映射到 ASP.NET Core Identity 中的一个表(AspNetUsers)?
问题描述
我正在 ASP.NET Core MVC 中创建一个学习评估 Web 应用程序。我计划拥有两个独立的数据库:一个用于使用 Identity Framework 的用户,另一个用于使用 Dapper 的数据。但是,我的模型与我的用户(Instructor
,Student
)有关系。这是我绘制的显示关系的实体关系图:
例如,我必须Course
为每个Student
实例包含一个导航属性。同样,TestInstance
包含Instructor
和的导航属性Student
,明确区分了两个用户类。我还需要另一个名为的用户类Administrator
:
用户类 | 责任 |
---|---|
Student |
参加考试 |
Instructor |
创建和安排测试 |
Administrator |
管理教师和学生的帐户和课程。拥有导师的所有特权 |
我知道可以通过派生在 Identity 中创建自定义属性,IdentityUser
但我需要维护三个不同的用户类,并且 Identity 只提供一个名为AspNetUsers
. 我不想在我的域模型中直接使用 Identity 中的表。事实上,如果 Identity 可以拥有自己的独立数据库,那就太好了。管理员将是创建和管理教师和学生帐户的人。
我的问题是:
有什么方法可以创建三个模型/实体Student
,Instructor
并Adminstrator
作为我的域模型的一部分,然后让它们都使用身份AspNetUsers
表中的 ID?
他们的角色信息可以存储为声明或AspNetUserRoles
Identity 提供的表中。
然后我可以使用 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");
}
}
推荐阅读
- javascript - 基于另一个可观察对象的可观察地图属性
- javascript - 为什么我的应用在移动设备上的行为与在桌面设备上的行为不同?
- django - 对于 UUID,Django is-instance 无法正常工作
- java - Android EACCES(权限被拒绝)仅在某些设备上
- drake - 使用 Drake 和 Mosek 的 SOS 多项式产生错误代码 1501
- python - 如何在python中使用re函数
- angular - 如何将 rxjs 运算符与 ngrx-form 一起使用?
- python - Keras:将多个输出连接成图像分割中的最终输出
- javascript - 路由到具有不同参数的同一页面时,NextJS 初始状态未更新
- c# - 如何获得异步调用的结果?