在 ASP.NET Identity 中使用 AspNetUsers table 的自定义属性

Using custom properties for AspNetUsers table in ASP.NET Identity

我在 MVC 应用程序中使用 ASP.NET Identity 2.0 并且有一个名为 AspNetUsers 的默认 table 以便将用户数据与以下列:

AspNetUsers:

Id
Email
EmailConfirmed
PasswordHash
... etc

我知道我可以向此实体添加自定义属性,如 NameSurnameAspNetUsers table。但是,我的项目中有两种类型的用户:StudentProfessor。因此我需要使用不同的属性,如下所示:

学生:

Id
Name
Surname
Email
StudentNumber
Department

教授:

Id
Name
Email
Surname
Profession
RoomNumber

此时我在组合这些实体时遇到了问题,我不知道如何组合它们。学生和教授存储在 AspNetUsers table 中,我认为没有必要在不同的 table 上定义与 Email 相同的数据,最好只使用StudentProfessor table 中的不同属性如 StudentNumberRoomNumber 等。当用户登录系统时,我想使用 AspNetUsers table 然后从 StudentProfessor table 获取当前用户的详细数据。对于这种情况有更好的方法吗?我认为 ASP.NET Identity 是常用的,很多人需要为不同类型的用户存储不同的细节属性。任何帮助,将不胜感激。

将通用属性移至 AspNetUsers table,即您的姓名、电子邮件、姓氏。同样,登录详细信息功能对学生和教师都是相同的,这些 table 也是如此。对于特定于教师或教授的信息,那是 您需要特定 table 的地方。例如

public class AspNetUser
{ 
    // Normal properties

    public virtual Professor Professor { get; set; }

    public virtual Student Student { get; set; }
}

public class Professor 
{
    [Key]
    public int Id { get; set; }

    public virtual AspNetUser User { get; set; } // This is where you will be able to retrieve their name, email etc

    public string Profession { get; set; } 

    // Any other properties specific to a Professor
}

这是另一种可能的解决方案,但它是否适合您的需要取决于您。您可以为您的模型 Table 每个层次结构 (TPH)。首先使您的用户 class 抽象并将所有通用属性放在那里:

public abstract class ApplicationUser : IdentityUser
{
    //snip

    //Common properties
    public string Name { get; set; }
    public string Surname { get; set; }
}

现在创建不同的用户类型 classes 并从基础 class:

继承
public class StudentUser : ApplicationUser
{
    public string StudentNumber { get; set; }
}

public class ProfessorUser : ApplicationUser
{
    public string Profession { get; set; }
}