Asp.net mvc 5 我可以在ASP.NET MVC中创建多个标识表吗?

Asp.net mvc 5 我可以在ASP.NET MVC中创建多个标识表吗?,asp.net-mvc-5,asp.net-identity,Asp.net Mvc 5,Asp.net Identity,在我的项目中,管理员添加讲师,然后每个讲师添加他的学生。添加后,他们将收到一封电子邮件,要求他们完成注册 我的项目中有以下课程: 一班制 Student: int id, int Registry number, int grade, string password, string email, string name 2-讲师班: Instructor: int id, string name , string email , string password 3-My数据库上下文: pu

在我的项目中,管理员添加讲师,然后每个讲师添加他的学生。添加后,他们将收到一封电子邮件,要求他们完成注册

我的项目中有以下课程:

一班制

Student: int id, int Registry number, int grade, string password, string email, string name
2-讲师班:

Instructor: int id, string name , string email , string password
3-My数据库上下文:

 public class InstructorContext:DbContext
{
    public InstructorContext() : base("InstructorContext")
    {
    }

    public DbSet<Instructor> Instructors { get; set; }
    public DbSet<Student> Students { get; set; }}
公共类讲师上下文:DbContext
{
public InstructorContext():基本(“InstructorContext”)
{
}
公共DbSet指令器{get;set;}
公共数据库集学生{get;set;}

当用户登录时,我必须确定他是管理员、讲师还是学生。我必须使用基于角色的身份验证吗?我已经为不同的角色开设了两个独立的课程。这两个表都可以从IdentityUser继承吗?

不,不能有多个具有Identity的用户表,至少在技术上不能。Identity的所有其他核心组件(角色、声明、登录等)都使用外键设置到一个用户表

对于这里的场景,应该使用继承。例如:

public class ApplicationUser : IdentityUser

public class Instructor : ApplicationUser

public class Student : ApplicationUser
默认情况下,Entity Framework将为
ApplicationUser
创建一个表,并向其中添加一个
鉴别器
列。此列将具有三个可能值之一:“应用程序用户”、“讲师”和“学生”。当EF从这个表中读取时,它将使用这个列来实例化正确的类。这就是所谓的单表继承(STI)或每层次表继承(TPH)。这种方法的主要缺点是所有类的所有属性都必须在同一个表中表示。例如,如果您正在创建一个新的
学生
,那么
讲师
的列仍将保留在记录中,只有这些值为空或默认值。这也意味着您不能在数据库级别对诸如
讲师
之类的对象强制执行属性,因为这将阻止保存无法提供这些值的
应用程序用户
学生
实例。换句话说,派生类上的所有属性都必须为空。但是,您仍然可以强制执行某些内容,例如使用视图模型生成表单所需的属性

如果您真的想要有单独的表,您可以通过将继承策略更改为所谓的每类型表(TPT),在某种程度上实现这一目标。这将为
ApplicationUser
保留该表,但添加两个额外的表,分别为
讲师
学生
添加一个表。但是,所有核心属性、外键等都将在
ApplicationUser
的表中,因为它们是在表中定义的。
讲师
学生
的表将仅包含在这些类上定义的属性(如果有)和
应用程序用户
表的外键。查询时,EF将执行联接以从所有这些表中引入数据,并用适当的数据实例化适当的类。一些纯粹主义者更喜欢这种方法,因为它可以使数据在数据库中保持规范化。然而,由于连接,查询端的数据量必然会更大

最后一句话要小心,因为这会让人们不断地用身份来处理继承问题。
UserManager
类是一个泛型类(
UserManager
)。例如,
AccountController
中的默认实例是
UserManager
的一个实例。因此,如果使用该实例,则无论
Discriminator
列的值如何,从查询返回的所有用户都将是
ApplicationUser
实例。要获取
讲师
实例,您需要实例化
用户管理器
,并将其用于与
讲师
相关的查询

第一次创建用户时尤其如此。考虑以下事项:

var user = new Instructor();
UserManager.Create(user);

您可能希望用户将使用“讲师”的鉴别器值保存,但实际上它将使用“ApplicationUser”保存。这是因为,同样,
UserManager
UserManager
的一个实例,您的
讲师正在升级。同样,只要您记得使用适当类型的
UserManager
,您就可以了。

如果我只有一个Admin,我需要添加“Admin”类吗?或者检查电子邮件和密码就足够了吗?不,我的意思是你可以,但是“管理员”更通常被认为是一个角色。区分的一个好方法是考虑重叠。如果像
讲师这样的人也可以是管理员(不管你是否真的允许),那么作为一个角色可能会更好。这样,如果需要,您可以让讲师成为管理员,而不会影响系统的其余部分。否则,您将得到像
讲师
管理员
管理员讲师
这样的东西,这显然会很快变得混乱。此外,通过使用角色,您可以将类似
[Authorize(Roles=“Admin”)]
的内容添加到仅针对管理员的控制器/操作中。作为另一个派生类型,您需要创建一些自定义内容来确定访问级别。哦,对不起。我想我一开始误解了你的问题。从技术上讲,你也可以有教师和学生的角色。我认为最好将它们作为派生类型,因为它们可能有自己的数据。至少,在您的
讲师
课堂上设置类似于
ICollection
的内容可能会很好,例如,这对
应用程序用户
学生
没有意义。像Admin这样的东西更像是一种特殊情况,并不意味着需要存储很多特定的数据。更多的是关于特权,那你就做错了。很可能,您没有使用view m