为AspNetUsers标识新表外键



我正在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)。

如果我假设PatientDoctor实际上都是"用户"是正确的,那么您实际上应该从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采用单表继承,因此在这种配置中,实际上不会为DoctorPatient提供单独的表。相反,两者的所有属性都将添加到AspNetUsers中。在大多数情况下,这不是一个问题。唯一可能出现问题的是,如果您只需要一个特定于一个子类的属性,例如Doctor。此配置中的子类上的所有属性都必须可以为null,因为在保存Patient时,逻辑上没有办法为Doctor提供所需的值。但是,这仅在数据库级别强制执行。例如,您仍然可以根据需要自由验证表单中的输入,即使支持它的表列不是。

也就是说,你还可以使用其他策略。在这种情况下,最合适的替代方案是TPT,或每种类型的表。在这里,您可以为每个离散类型ApplicationUserDoctor,Patient获得一个表。然后,在子类(DoctorPatient)上,将外键添加到ApplicationUserApplicationUser实例持有实体的真实"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; }
}

相关内容

  • 没有找到相关文章

最新更新