2017-09-04 213 views
1

使用ASP.NET核心身份与实体框架的核心,我需要在我的应用程序添加不同类型的用户:不同的用户类型与ASP.NET 1.1的核心身份和Entity Framework核心

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

我完成了创建两个表格:一个是学生,一个是老师。这两个表与ApplicationUser表是一对一的关系。

我想知道这是否正确,或者我做错了什么,,因为当用迁移更新数据库时,它会在“学生”表中引发错误“FOREIGN KEY'FK_Student_AspNetUsers_Id'可能导致周期或多个级联路径,指定ON DELETE NO ACTION或UPDATE NO ACTION“。在任何情况下,如果它正确,最后我会有一个ApplicationUser类,它有两列(一个用于StudentId,另一个用于TeacherId),其中一个将始终为空,因为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为空的,因此上面提到的错误消失。

回答

0

您不应该为每个用户类型创建不同的表。 您应该创建角色并将该角色分配给用户。例如,创建一个角色的学生和角色老师,并根据您的需求分配他们。

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

当您需要为学生/老师保存附加值时,我会做与您的设计类似的工作。 但我不会将我的学生/老师的ID添加到我的ApplicationUser类中。 我只是简单地将UserId添加到我的学生/教师课程中。 所以设计问题应该是你试图把这些东西放到ApplicationUser类中。

+0

我同意你的看法,这不是一个好的设计。我已经为不同的用户提供了角色,但是我还需要为他们每个角色提供不同的属性,我认为使用ApplicationUser作为用户与商业数据库中的其余表相关联也是一个糟糕的设计。 – MorgoZ

+0

例如,学生有出生日期和入学日期,而老师没有,老师可以有主题。他们有不同的属性,所以ApllicationUser不是设置所有用户的类型属性的地方。 – MorgoZ

+0

我明白你在想什么。我编辑了我的答案。 – user743414