ASP.NET Core 1.1 Identity和Entity Framework Core

时间:2017-09-04 09:14:20

标签: c# asp.net-core asp.net-identity entity-framework-core

将ASP.NET核心标识与实体框架核心一起使用我需要在我的应用程序中添加不同类型的用户:

假设我需要两种类型的用户:“学生”和“老师”;它们都是ApplicationUsers,因为它们必须经过身份验证才能访问应用程序。

我已经完成了创建两个表:一个用于学生,一个用于教师。两个表都与ApplicationUser表一一对应。

我想知道这是否正确或者我做错了什么,因为在使用迁移更新数据库时会抛出错误“学生”表中的“FOREIGN KEY'FK_Student_AspNetUsers_Id'可能导致循环或多个级联路径。指定ON DELETE NO ACTION或UPDATE NO ACTION“。并且,在任何情况下,如果它正确,最后我有一个ApplicationUser类有两列(一个用于StudentId,另一个用于TeacherId),其中一个将始终为null,因为ApplicationUser可以是Student或老师,但不是两者。

到目前为止,这是我的代码:

public class ApplicationUser : IdentityUser<int>
{
    public string Name { get; set; }

    [ForeignKey("Teacher")]
    public int? TeacherId { get; set; }
    public virtual Teacher Teacher { get; set; }
    [ForeignKey("Student")]
    public int? StudentId { get; set; }
    public virtual Student Student { get; set; }
}

public class Student
{
    [Key, ForeignKey("User")]
    public int Id { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public string MotherMaidenName { get; set; }
    public DateTime BirthDate { get; set; }
    public DateTime EnrollmentDate { get; set; }

    public virtual ApplicationUser User { get; set; }
}

public class Teacher
{
    [Key,ForeignKey("User")]
    public int Id { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public string MotherMaidenNAme { get; set; }

    public virtual ApplicationUser User { get; set; }
}

更新:我已将TeacherId和StudentId设置为可为空,因此上述错误消失了。

1 个答案:

答案 0 :(得分:0)

您不应为每种用户类型创建不同的表。 您应该创建角色并将该角色分配给用户。例如,创建角色学生和角色教师,并根据您的需要进行分配。

所以我会说你所做的并不是一个好的设计。

当您需要为学生/教师保存其他值时,我会为您的设计做类似的事情。 但我不会将我的学生/老师的ID添加到我的ApplicationUser课程中。 我只想在我的学生/老师班上添加一个UserId。 因此,设计问题应该是您尝试将这些内容放入ApplicationUser类中。