【问题标题】:Using custom properties for AspNetUsers table in ASP.NET Identity在 ASP.NET Identity 中使用 AspNetUsers 表的自定义属性
【发布时间】:2016-06-23 10:10:52
【问题描述】:

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

AspNetUsers:

Id
Email
EmailConfirmed
PasswordHash
... etc

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

学生:

Id
Name
Surname
Email
StudentNumber
Department

教授:

Id
Name
Email
Surname
Profession
RoomNumber

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

【问题讨论】:

  • 您描述的方法有什么问题?我自己做,效果很好
  • 我只是想确定是否有更好的方法以及这种方法是否良好。如果您有想法,请您看看下面的 3 个问题并发表您的意见吗?谢谢。

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


【解决方案1】:

这是另一种可能的解决方案,但您可以自行确定它是否适合您的需求。您可以为您的模型创建每个层次结构 (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; }
}

【讨论】:

  • 实际上这似乎是一个很好的方法,但是,因为我使用 EF Code First,我不确定如何使用它。例如,当我使用 StudentUser 实体创建学生记录并添加姓名、姓氏时,EF 是否会将姓名、姓氏添加到 ApplicationUser 表中,因为它会将 StudentNumber 添加到 StudentUser?有什么想法吗?
  • 是的,所有属性都将位于同一个用户表中,包括名为Discriminator 的列,其中将包含StudentUser 之类的值,以便EF 确定类型。
  • 另外,这只是代码,根据定义,代码优先。
  • 我会尽快尝试并通知您是否有效。投票+
  • 我更喜欢这种方法+1
【解决方案2】:

将常用属性移至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
}

【讨论】:

  • 非常感谢。在那种情况下,我认为我的方法没有问题。另一方面,我想知道这些点,如果你澄清我的问题,我会很高兴>>>
  • 1) 我还将 Type 属性添加到 AspNetUser 表中,以确定用户是学生还是教授。然后在创建新用户时,我向 AspNetUser 表添加一条新记录,并使用自定义属性向 Student 或 Professor 表添加另一条记录,这是真的吗? 2) 如果第一个是真的,你建议在EF中使用事务吗? 3) 当用户登录系统时,我在身份验证期间查看类型,然后从相应表中检索详细数据。真的吗?谢谢...
  • @binary 不幸的是,这些都是不同的问题,所以您可能想问一些新问题。但是,不要创建 Type 属性。在您的AspNetUsers 表中,您将有public virtual Professor 和另一个Student,然后如果一个为空,您将知道它是哪一个。
  • 感谢您的回复,但我不明白您对 Type 属性的解释是什么意思。你能再澄清一点吗?
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
相关资源
最近更新 更多