请查看我之前的问题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成功创建了包含以下表格的数据库:
我检查过Student和Teachers表包含来自IdentityUser基类的4个继承列,即:
现在我对我所做的是正确的方法感到困惑,或者我完全走错了路。如果这是正确的方法,而不是为什么EF生成 AspNetUsers 表?我只想要两种类型的用户,应该是学生和教师。这个AspNetUsers表有什么用?
如果这不是正确的方法,请指导我正确的路径?
非常感谢提前。
答案 0 :(得分:1)
您需要考虑更好的实体关系结构来保存student
和teacher
信息。
我想现在每个人都会认为你需要在看到问题时使用UserRole
。
这是因为Student
和Teacher
都需要注册,并且都属于用户帐户。
我建议您使用两种不同的解决方案:
1)为Student
和Teacher
的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)创建附加信息实体以存储Student
和Teacher'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; }
}
然后您不再需要Student
和Teacher
个实体。