我正在MVC身份下创建一个新表(我们称之为Chart),它由2列(PatientId和DoctorId)组成,它们将引用回AspNetUsers的Id列。新表也将拥有自己的PK。以下是 IdentityModels 类。
public class ApplicationUser : IdentityUser
{
public virtual Chart Chart { get; set; }
...
}
public class Chart
{
[Key]
public int Id { get; set; }
//How to FK the following two params?
public string PatientId { get; set; }
public string DoctorId { get; set; }
public virtual ApplicationUser User { get; set; } // navigation property
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false) {
}
public System.Data.Entity.DbSet<Chart> Chart { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
我可以知道如何将PatientId和DoctorId引用回AspNetUsers表的Id列吗?
这将是一对多的关系(一个DoctorId可以有许多PatientId,但一个PatientId只能附加到一个DoctorId)。
答案 0 :(得分:2)
如果我认为Patient
和Doctor
实际上都是“用户”,那么你应该从ApplicationUser
继承它们。
public class Patient : ApplicationUser
{
// patient-specific properties
[ForeignKey("Doctor")]
public string DoctorId { get; set; } // IdentityUser's PK is string by default
public virtual Doctor Doctor { get; set; }
}
public class Doctor : ApplicationUser
{
// doctor-specific properties
public virtual ICollection<Patient> Patients { get; set; }
}
默认情况下,Entity Framework使用单表继承,因此在此配置中,您实际上不会为Doctor
和Patient
添加单独的表。相反,两者的所有属性都将添加到AspNetUsers
。在大多数情况下,这不是问题。唯一可能有问题的是,如果您需要特定于一个子类的属性,例如Doctor
。此配置中子类的所有属性都必须是可为空的,因为在保存Doctor
时,逻辑上无法为Patient
提供所需的值。但是,这仅在数据库级别强制执行。您仍然可以自由地验证表单中的输入,例如,根据需要,即使支持它的表列不是。
也就是说,您可以使用其他策略。在这种情况下,最合适的替代方案是TPT或Table-Per-Type。在这里,您可以获得每个离散类型的表格ApplicationUser
,Doctor,
和Patient
。然后,在子类(Doctor
和Patient
)上将外键添加到ApplicationUser
。正是ApplicationUser
实例保存了实体的真实“id”。要使用TPT,就像为每个类添加Table
属性一样简单:
[Table("Doctors")]
public class Doctor : ApplicationUser
[Table("Patients")]
public class Patient : ApplicationUser
<强>更新强>
关于Chart
,使用此设置,您的实现将如下所示:
public class Chart
{
[Key]
public int Id { get; set; }
[ForeignKey("Patient")]
public string PatientId { get; set; }
public virtual Patient Patient { get; set; }
[ForeignKey("Doctor")]
public string DoctorId { get; set; }
public virtual Doctor Doctor { get; set; }
}