这种方法在MVC-5中是否正确?

时间:2013-12-21 12:37:10

标签: c# asp.net-mvc asp.net-identity

请查看我之前的问题Here

正如我在上一个问题中提到的,我使用Asp.Net Identity进行用户身份验证。根据前一个问题中提供的the answer,我做了这个:

public class Student: IdentityUser
{
  ...
  ..... *other properties*

  public int ContactId { get; set; }
  public virtual Contact Contact { get; set; }
}

public class Teacher: IdentityUser
{
  ...
  ..... *other properties*

  public int ContactId { get; set; }
  public virtual Contact Contact { get; set; }
}

public class Contact
{
  public int Id { get; set; }

  ...
  ..... *other properties*
}


    public class MyContext : IdentityDbContext
    {
        public DbSet<Contact> Contacts { get; set; }

        public MyContext()
            : base("MyDatabase")
        { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Students");
            });

            modelBuilder.Entity<Teacher>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Teachers");
            });

            //1 to 1 foreign key relationship b/w Student and Contact
            modelBuilder.Entity<Student>().HasRequired(p => p.Contact).WithMany().HasForeignKey(p => p.ContactId);

            //1 to 1 foreign key relationship b/w Teacher and Contact
            modelBuilder.Entity<Teacher>().HasRequired(p => p.Contact).WithMany().HasForeignKey(p => p.ContactId);

            base.OnModelCreating(modelBuilder);
        }
    }

编写此代码并运行Add-Migration命令以创建初始迁移,并使用Update-Database创建数据库。 EF成功创建了包含以下表格的数据库:

  • _MigrationHistory
  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers
  • 学生
  • 教师
  • 联系人

我检查过Student和Teachers表包含来自IdentityUser基类的4个继承列,即:

  • 编号
  • 用户名
  • PasswordHash
  • SecurityStamp

现在我对我所做的是正确的方法感到困惑,或者我完全走错了路。如果这是正确的方法,而不是为什么EF生成 AspNetUsers 表?我只想要两种类型的用户,应该是学生和教师。这个AspNetUsers表有什么用?

如果这不是正确的方法,请指导我正确的路径?

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

您需要考虑更好的实体关系结构来保存studentteacher信息。 我想现在每个人都会认为你需要在看到问题时使用UserRole。 这是因为StudentTeacher都需要注册,并且都属于用户帐户。

我建议您使用两种不同的解决方案:

1)为StudentTeacher的ApplicationUser类添加外键,如下所示:

public class ApplicationUser : IdentityUser
{
    public int ContactId { get; set; }

    public int? StudentId { get; set; }

    public int? TeacherId { get; set; }

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

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<Contact> Contacts { get; set; }
    public DbSet<Student> Student { get; set; }
    public DbSet<Teacher> Teacher { get; set; } 
}

当您注册一个帐户时,您知道该帐户适用于教师,只需填写教师信息,并且User表中的studentId将为NULL。

2)创建附加信息实体以存储StudentTeacher's信息,将学生和教师的所有属性放在一起,如下所示:

public class ApplicationUser : IdentityUser
{
    public int ContactId { get; set; }
    public int AdditionalInfoId { get; set; }

    [ForeignKey("ContactId")]
    public virtual Contact Contact { get; set; }

    [ForeignKey("AdditionalInfoId")]
    public virtual AdditionalInfo AdditionalInfo { get; set; }

}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<Contact> Contacts { get; set; }
    public DbSet<AdditionalInfo> AdditionalInfo { get; set; }
}

然后您不再需要StudentTeacher个实体。