我正在MVC Identity下创建一个新表(我们称之为Chart),它由两列(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只能附加到一个Doctor Id)。
如果我假设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; }
}
默认情况下,EntityFramework采用单表继承,因此在这种配置中,实际上不会为Doctor
和Patient
提供单独的表。相反,两者的所有属性都将添加到AspNetUsers
中。在大多数情况下,这不是一个问题。唯一可能出现问题的是,如果您只需要一个特定于一个子类的属性,例如Doctor
。此配置中的子类上的所有属性都必须可以为null,因为在保存Patient
时,逻辑上没有办法为Doctor
提供所需的值。但是,这仅在数据库级别强制执行。例如,您仍然可以根据需要自由验证表单中的输入,即使支持它的表列不是。
也就是说,你还可以使用其他策略。在这种情况下,最合适的替代方案是TPT,或每种类型的表。在这里,您可以为每个离散类型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; }
}