Невозможно вставить дубликат ключа. Составной первичный ключ. ASP. NET Entity Framework - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать приложение, используя 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 , если это может помочь

1 Ответ

2 голосов
/ 08 апреля 2020

Родительский ключ идет первым:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...