我正在创建一个Visual Studios MVC5 Web应用程序,我试图将AspNetUser表中的id作为外键引用。
我正在创建一个新表:
public class Patient
{
public int PatientId { get; set; }
public string HCN { get; set; }
public string GP { get; set; }
public string MedHis { get; set; }
public string Medication { get; set; }
public string CurrentPrescription { get; set; }
public string PresentRX { get; set; }
[ForeignKey("UserId")]
public virtual ApplicationUser UserId { get; set; }
}
我的Patient
配置类:
public class PatientConfig : EntityTypeConfiguration<Patient>
{
public PatientConfig()
{
ToTable("Patient");
Property(x => x.PatientId).HasColumnName("IntId");
HasKey(x => x.PatientId);
Property(x => x.HCN).HasColumnName("strHCN");
Property(x => x.GP).HasColumnName("strGP");
Property(x => x.MedHis).HasColumnName("strMedHis");
Property(x => x.Medication).HasColumnName("strMedication");
Property(x => x.CurrentPrescription).HasColumnName("strCurrentPrescription");
Property(x => x.PresentRX).HasColumnName("strPresentRX");
Property(x => x.UserId).HasColumnName("intUserId");
}
}
首先我收到了错误
必须是不可为空的值类型才能将其用作参数
在UserId
属性下面,所以我删除了它
Property(x=> x.UserId).HasColumnName("intUserId");
当我尝试添加迁移时,出现以下错误:
属性&#39; UserId&#39;上的ForeignKeyAttribute on type&#39; ModelTest.Models.Patient&#39;无效。外键名称&#39; UserId&#39;没有在依赖类型&ModelTest.Models.Patient&#39;上找到。 Name值应该是以逗号分隔的外键属性名称列表。
我不明白如何找不到UserId
,我们将非常感谢任何建议。
由于
答案 0 :(得分:1)
这与任何其他关系一样。 ApplicationUser
没有什么特别之处。您似乎并不真正了解如何首先设置实体框架关系。
如果不关心您可以在应用程序中访问的显式外键属性,那么您需要添加到实体的所有内容是:
public virtual ApplicationUser User { get; set; }
这将导致Entity Framework在您的实体表上生成隐式外键,但您将无法直接在您的应用程序中访问此值。 User
将是ApplicationUser
的完整实例。
如果你做想直接访问外键属性,那么你需要这样的东西:
[ForeignKey("User")]
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
现在,除了允许您访问相应ApplicationUser
实例的导航属性之外,实体上还有一个实际属性来保存外键值。
虽然实体框架实际上应该能够按惯例确定UserId
本身是User
导航属性的外键,但我发现使用{始终明确表示它是更好的{1}}属性。
另请注意,ForeignKey
的类型为UserId
。这种类型string
默认使用主键。如果您愿意,可以更改它,但如果您只是使用标准部署,那么它将是IdentityUser
而不是string
,您似乎认为它将在您的代码中
答案 1 :(得分:0)
[ForeignKey("User")]<br/>
public string UserId { get; set; }<br/>
public virtual ApplicationUser User { get; set; }
当我将以上行添加到类中,然后迁移并更新数据库时,
我创建了ApplicationUser表!