无法插入重复密钥。复合主键。 ASP.NET实体框架

时间:2020-04-08 16:06:54

标签: asp.net .net sql-server asp.net-mvc entity-framework

我正在尝试使用Entity Framework创建应用程序。

我想做的事(每个实体也都有ID):

enter image description here

在这种情况下,我想使用复合主键(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方法

1 个答案:

答案 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);