我正在尝试使用Entity Framework创建应用程序。
我想做的事(每个实体也都有ID):
在这种情况下,我想使用复合主键(PatientId + DiagnosisId
)。
病人模型类中有一组诊断:
public ICollection<Diagnosis> Diagnoses { get; set; }
public class Diagnosis
{
[Required]
[MaxLength(200)]
public String Type { get; set; }
public String Complications { get; set; }
public String Details { get; set; }
public Int32 DiagnosisId { get; set; }
public Patient Patient { get; set; }
public Int32 PatientId { get; set; }
}
也在我定义的数据库上下文中
public DbSet<Diagnosis> Diagnoses { get; set; }
和
modelBuilder.Entity<Diagnosis>().HasKey(x => new { x.DiagnosisId, x.PatientId });
在OnModelCreating
方法中创建复合主键。
在ASP.NET MVC CRUD控制器中,我创建Diagnosis
,每次DiagnosisId
都等于0。而且我无法将新数据粘贴到数据库,因为它就像重复的一样。如果可以的话,这就是我在Pastebin上的create post方法
答案 0 :(得分:2)
父键优先:
modelBuilder.Entity<Diagnosis>().HasKey(x => new { x.PatientId, x.DiagnosisId });
因为您希望将特定专利的所有诊断信息存储在一起。
并且您需要请求密钥是由数据库生成的。对于EF Core,它是:
modelBuilder.Entity<Diagnosis>().Property(r => r.DiagnosisId).ValueGeneratedOnAdd();
对于EF6,它是:
modelBuilder.Entity<Diagnosis>().Property(r => r.DiagnosisId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);