C# 标识AspNetUsers的新表外键
我正在MVC标识下创建一个新表(我们称之为图表),该表由两列(PatientId和DoctorId)组成,它们将引用回AspNetUsers的Id列。新表也将有自己的PK。下面是IdentityModels类C# 标识AspNetUsers的新表外键,c#,asp.net-mvc,asp.net-mvc-5,asp.net-identity,C#,Asp.net Mvc,Asp.net Mvc 5,Asp.net Identity,我正在MVC标识下创建一个新表(我们称之为图表),该表由两列(PatientId和DoctorId)组成,它们将引用回AspNetUsers的Id列。新表也将有自己的PK。下面是IdentityModels类 公共类应用程序用户:IdentityUser { 公共虚拟图表{get;set;} ... } 公共课程表 { [关键] 公共int Id{get;set;} //如何FK以下两个参数? 公共字符串PatientId{get;set;} 公共字符串DoctorId{get;set;} 公共
公共类应用程序用户:IdentityUser
{
公共虚拟图表{get;set;}
...
}
公共课程表
{
[关键]
公共int Id{get;set;}
//如何FK以下两个参数?
公共字符串PatientId{get;set;}
公共字符串DoctorId{get;set;}
公共虚拟应用程序用户用户{get;set;}//导航属性
}
公共类ApplicationDbContext:IdentityDbContext
{
公共应用程序上下文()
:base(“DefaultConnection”,throwifvv1schema:false){
}
public System.Data.Entity.DbSet图表{get;set;}
公共静态应用程序上下文创建()
{
返回新的ApplicationDbContext();
}
我可以知道如何将我的PatientId和DoctorId引用回AspNetUsers表的Id列吗
这将是一种一对多的关系(一个DoctorId可以有多个PatientId,但一个PatientId只能附加到一个DoctorId)。如果我正确地假设
患者和医生实际上都是“用户”,那么您实际上应该从应用程序用户继承他们
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; }
}
更新
关于图表
,使用此设置,您的实现如下所示:
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; }
}
如果我正确地假设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; }
}
更新
关于图表
,使用此设置,您的实现如下所示:
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; }
}
你设计这个的方式,你创建了一个多对多关系。你可以有两个图表指向同一个病人但不同的医生。你设计这个的方式,你创建了一个多对多关系。你可以有两个图表指向同一个病人但不同的医生。是的,你是对的,他们都是用户在AspNetUsers中注册的帐户。但我试图实现的是有一个表,其中有两列(PatientId和DoctorId),它们将引用(FK)AspNetUsers的Id列。当然,这个新表本身也将有一个PK。您实际上是在谈论TPT继承策略(请参阅我更新的答案),这有效地创建了相同的场景。但是,出于各种原因,您最好实际使用继承,而不是手动创建外键。如果医生和患者是用户,那么他们应该在系统中以这种方式建模。我运行了您的继承方法,并在添加迁移和更新数据库之后,我的AspNetUsers表现在有两个新列,DoctorId和Discriminator。我可以知道Discriminator列是什么吗?Discriminator是要知道应该更新哪个类。值将是“Doctor”
,“Patient”
或“ApplicationUser”
取决于保存的是哪一个。噢,我突然想到,你可能对我的理解过于字面化了。我以表
属性为例提供了医生
的代码,但你打算对患者
做同样的事情。由于两者都使用TPT,我认为你根本不应该有一个鉴别器列。只需DoctorId
和PatientId
(作为一对一继承的一部分),是的,你是对的,他们都是在AspNetUsers中注册了帐户的用户。但我试图实现的是有一个表,其中有两列(PatientId和DoctorId),将引用(FK)AspNetUsers的Id列。当然,这个新表本身也会有一个PK。您实际上是在谈论TPT继承策略(请参阅我更新的答案),这有效地创建了相同的场景。但是,出于各种原因,您最好实际使用继承,而不是手动创建外键。如果医生和患者是用户,那么他们应该在系统中以这种方式建模。我运行了您的继承方法,并在添加迁移和更新数据库之后,我的AspNetUsers表现在有两个新列,DoctorId和Discriminator。我可以知道Discriminator列是什么吗?Discriminator是要知道应该更新哪个类。值将是“Doctor”
,“Patient”
或“ApplicationUser”
取决于保存的是哪一个。噢,我突然想到,你可能对我的理解过于字面化了。我以表
属性为例提供了医生
的代码,但你打算对患者
做同样的事情。由于两者都使用TPT,我认为你根本不应该有一个鉴别器列。而只是DoctorId
和PatientId
(作为一对一继承的一部分)。