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

在ASP.NET标识中使用AspNetUsers表的自定义属性,asp.net,asp.net-mvc,entity-framework,asp.net-identity,asp.net-identity-2,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Identity,Asp.net Identity 2,我在一个MVC应用程序中使用ASP.NET Identity 2.0,有一个名为AspNetUsers的默认表,用于保存具有以下列的用户数据: AspNetUsers: Id Email EmailConfirmed PasswordHash ... etc Id Name Surname Email StudentNumber Department Id Name Email Surname Profession RoomNumber 我知道我可以将自定义属性添加到此实体,如名称,姓氏,

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

AspNetUsers:

Id
Email
EmailConfirmed
PasswordHash
... etc
Id
Name
Surname
Email
StudentNumber
Department
Id
Name
Email
Surname
Profession
RoomNumber
我知道我可以将自定义属性添加到此实体,如
名称
姓氏
,等等添加到此
AspNetUsers
表中。但是,在我的项目中有两种类型的用户:
学生
教授
。因此,我需要使用不同的属性,如下所示:

学生:

Id
Email
EmailConfirmed
PasswordHash
... etc
Id
Name
Surname
Email
StudentNumber
Department
Id
Name
Email
Surname
Profession
RoomNumber
教授:

Id
Email
EmailConfirmed
PasswordHash
... etc
Id
Name
Surname
Email
StudentNumber
Department
Id
Name
Email
Surname
Profession
RoomNumber

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

将常用属性移动到
AspNetUsers
表,即您的姓名、电子邮件、姓氏。同样,学生和教师的登录详细信息功能也是一样的,这些表也是一样。有关特定于教师或教授的信息,请参见您需要特定表格的地方。例如

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
}

这里有另一个可能的解决方案,尽管这取决于您是否适合您的需要。您可以为模型按层次结构()创建表。首先,将用户类抽象化,并将所有公共属性放在其中:

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; }
}

你所描述的方法有什么问题?greatI只是想确定是否有更好的方法,这种方法是否好。如果你有想法,请看一下下面的3个问题,并评论一下你的观点?谢谢,非常感谢。在这种情况下,我认为我的方法没有问题。另一方面,我想知道这些要点,如果您能澄清我的观点,我会很高兴的>>>1)我还将Type属性添加到AspNetUser表中,以确定用户是学生还是教授。然后,在创建新用户时,我向AspNetUser表添加了一条新记录,并向Student或Professor表添加了另一条具有自定义属性的记录,这是真的吗?2) 如果第一个为真,您建议在EF中使用事务处理吗?3) 当用户登录到系统时,我会在身份验证期间查看类型,并从相应的表中检索详细数据。这是真的吗?谢谢…@binary不幸的是,这些都是独立的问题,所以你可能想问新的问题。但是,不要创建类型属性。在您的
AspNetUsers
表中,您将有
公共虚拟教授
,另一个用于
学生
,如果其中一个为空,您将知道它是哪一个。感谢您的回复,但我不明白您对类型属性的解释是什么意思。请你再澄清一点好吗?事实上,这似乎是一个很好的方法,但由于我首先使用EF代码,我不知道如何使用它。例如,当我使用StudentUser实体创建一个Student记录并添加Name,姓氏时,EF会在将StudentNumber添加到StudentUser时将Name,姓氏添加到ApplicationUser表中吗?有什么想法吗?是的,所有属性都将在同一个用户表中,包括一个名为
Discriminator
的列,该列中有一个值,如
StudentUser
,用于EF确定类型。此外,这只是代码,根据定义,首先是代码。我会尽快尝试,并通知您它是否有效。投票+我更喜欢这种方法+1