在ASP.NET标识中使用AspNetUsers表的自定义属性

时间:2016-06-23 10:10:53

标签: asp.net asp.net-mvc entity-framework asp.net-identity asp.net-identity-2

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

AspNetUsers:

Id
Email
EmailConfirmed
PasswordHash
... etc

我知道我可以将此自定义属性作为NameSurname等添加到此实体,此AspNetUsers表格。但是,我的项目中有两种类型的用户:StudentProfessor。因此,我需要使用不同的属性,如下所示:

学生:

Id
Name
Surname
Email
StudentNumber
Department

教授:

Id
Name
Email
Surname
Profession
RoomNumber

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

2 个答案:

答案 0 :(得分:3)

这是另一种可能的解决方案,但您需要确定它是否适合您的需求。您可以为模型指定每个层次结构(TPH)。首先让你的用户类抽象并将所有常见属性放在那里:

public abstract class ApplicationUser : IdentityUser
{
    //snip

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

现在创建不同的用户类型类并从基类继承:

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

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

答案 1 :(得分:2)

将公共属性移动到AspNetUsers表,即您的姓名,电子邮件,姓氏。同样,对于学生和教师来说,登录详细信息功能也是相同的,这些表也是如此。有关您需要特定表格的教师或教授 特定的信息。 E.g。

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
}