Я хочу добавить внешний ключ для таблицы с помощью метода onModelCreating в ядре asp. net - PullRequest
0 голосов
/ 09 июля 2020

Я создал две таблицы с именами «пациент» и «Прием». Для этого я создал модель пациента и классы модели приема. Затем я использую класс HospitalDbContext для создания таблиц с помощью метода onModelCreating. Я хочу использовать PatientId в качестве внешнего ключа таблицы допуска, но не могу найти способ добавить внешний ключ. Помогите мне решить эту проблему

Patient.cs:

public class Patient
    {
        public int PatientId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Nic { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
        public string Mobile { get; set; }
        public DateTime RegisterDate { get; set; }
        public string CurrentState { get; set; }
        public string Password { get; set; }
    }

Admission.cs:

 public class Admission
    {
        public int AdmissionId { get; set; }
        public int PatientId { get; set; }
        public DateTime AdmissionDate { get; set; }
        public string reason { get; set; }
    }

HospitalDbContext.cs:

public class HospitalDbContext : DbContext
    {
        public HospitalDbContext(DbContextOptions<HospitalDbContext> options)
            : base(options)
        {
        }

        public DbSet<Patient> Patients { get; set; }
       
        public DbSet<Admission> Admissions { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Patient>(entity =>
            {
                entity.HasKey(e => e.PatientId);
                entity.Property(e => e.FirstName);
                entity.Property(e => e.LastName);
                entity.Property(e => e.Nic);
                entity.Property(e => e.Age);
                entity.Property(e => e.Address);
                entity.Property(e => e.Email);
                entity.Property(e => e.Mobile);
                entity.Property(e => e.RegisterDate);
                entity.Property(e => e.CurrentState);
                entity.Property(e => e.Password);
            });
            modelBuilder.Entity<Admission>(entity=> 
            {
                entity.HasKey(e => e.AdmissionId);
                entity.Property(e => e.PatientId);
                entity.Property(e => e.AdmissionDate);
                entity.Property(e => e.reason);
            
            });
        }

        public DbSet<patient_information_system_api.Models.Admission> Admission { get; set; }
    }

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Насколько мне известно, мы не могли напрямую создать взаимосвязь без изменения вашего класса пациента и допуска.

Если вы хотите добиться взаимно однозначного отношения между Admission и Patient , вы должны добавить Прием и Пациент в качестве свойства в каждом классе, а затем использовать entity.HasOne(x=>x.Patient).WithOne(x=>x.Admission).HasForeignKey("PatientId"); to achieve your requirement.

Более подробную информацию вы можете найти в кодах ниже:

public class Patient
{
    public int PatientId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Nic { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string Mobile { get; set; }
    public DateTime RegisterDate { get; set; }
    public string CurrentState { get; set; }
    public string Password { get; set; }

    public Admission Admission { get; set; }
}

Прием:

   public class Admission
    {
        public int AdmissionId { get; set; }

         public int PatientId { get; set; }
        public DateTime AdmissionDate { get; set; }
        public string reason { get; set; }

        public Patient Patient{ get; set; }
    }

OnModelCreating:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Patient>(entity =>
        {
            entity.HasKey(e => e.PatientId);
            entity.Property(e => e.FirstName);
            entity.Property(e => e.LastName);
            entity.Property(e => e.Nic);
            entity.Property(e => e.Age);
            entity.Property(e => e.Address);
            entity.Property(e => e.Email);
            entity.Property(e => e.Mobile);
            entity.Property(e => e.RegisterDate);
            entity.Property(e => e.CurrentState);
            entity.Property(e => e.Password);
        });
        modelBuilder.Entity<Admission>(entity =>
        {
            entity.HasKey(e => e.AdmissionId);
            entity.Property(e => e.PatientId);
            entity.Property(e => e.AdmissionDate);
            entity.Property(e => e.reason);
            entity.HasOne(x=>x.Patient).WithOne(x=>x.Admission).HasForeignKey("PatientId");
        });
    }
1 голос
/ 09 июля 2020

Вам не нужно создавать внешний ключ там, просто go в Модель, в которую вам нужно добавить внешний ключ и сделать виртуальный из нужного вам класса модели:

В вашем случае вы можете применить это следующим образом:

public class Admission
{
    public int AdmissionId { get; set; }
    public int PatientId { get; set; }
    [ScaffoldColumn(false)]   //Add this to avoid create foreign key when scaffolding
    public virtual Patient Patient {get; set;} //Add this to work as foreign key
    public DateTime AdmissionDate { get; set; }
    public string reason { get; set; }
}

После этого, когда вам нужно прочитать внешний ключ, вы можете легко прочитать его следующим образом:

//.Include used to read the foreign key    
var _admission = await db.admission.Include(a => a.Patient).OrderBy(x => x.AdmissionDate);

И вы можете узнать больше о внешнем ключе и отношениях по этой ссылке: https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

...