Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标识AspNetUsers的新表外键_C#_Asp.net Mvc_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

C# 标识AspNetUsers的新表外键

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;} 公共

我正在MVC标识下创建一个新表(我们称之为图表),该表由两列(PatientId和DoctorId)组成,它们将引用回AspNetUsers的Id列。新表也将有自己的PK。下面是IdentityModels类

公共类应用程序用户: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
(作为一对一继承的一部分)。