Вставка "многие ко многим" с мягким удалением, реализованным на базовой таблице - PullRequest
0 голосов
/ 30 октября 2019

Мне нужна помощь в том, как приступить к записи вставки во многих ситуациях. Сначала я думал о том, как это сделать, но я смог найти собственное решение для вставки. Но это не удалось при сохранении из-за того, что столбец isDeleted не найден в таблице соединений PatientCentre. Идея состоит в том, что пациент может войти в любой из центров, назначенных для

Вот как мой код выглядит как

Вот моя модель пациента и центра с таблицей соединения (PatientCentre)

    public class Patient
    {
        public long Id { get; set; }    
        public string FirstName { get; set; }    
        public string LastName { get; set; }    
        public DateTime CreatedAt { get; set; }      
        public virtual ICollection<PatientCentre> PatientCentres { get; set; }    
        public Patient()
        {
            PatientCentres = new HashSet<PatientCentre>();
        }
    }

    public class Centre
    {
        public int Id { get; set; }    
        public string Name { get; set; }    
        public string Location { get; set; }    
        public bool IsActive { get; set; }    
        public DateTime Created { get; set; }    
       public virtual ICollection<PatientCentre> PatientCentres { get; set; }    
        public Centre()
        {
            PatientCentres = new HashSet<PatientCentre>();
        }
    }   

     public class PatientCentre
     {
          public long PatientId { get; set; }        
          public int CentreId { get; set; }        
          public Patient Patient { get; set; }        
          public Centre Centre { get; set; }
     }

Вот моя таблица отношений FluentAPI для соединительной таблицы

public class PatientCentreConfiguration : IEntityTypeConfiguration<PatientCentre>
{
    public void Configure(EntityTypeBuilder<PatientCentre> builder)
    {
        builder.HasKey(pc => new { pc.CentreId, pc.PatientId });

        builder.HasOne(pc => pc.Centre)
            .WithMany(c => c.PatientCentres)
            .HasForeignKey(pc => pc.CentreId)
            .OnDelete(DeleteBehavior.Restrict);

        builder.HasOne(pc => pc.Patient)
            .WithMany(p => p.PatientCentres)
            .HasForeignKey(pc => pc.PatientId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

Вот таблица пациента, имеющая флаг isDeleted. Я не включил это в свою модель, так как хотел скрыть это

public class PatientConfiguration : IEntityTypeConfiguration<Patient>
{
    public void Configure(EntityTypeBuilder<Patient> builder)
    {
        builder.HasKey(p => p.Id);

        builder.Property<bool>("IsDeleted");

        builder.HasQueryFilter(m => EF.Property<bool>(m, "IsDeleted") == false);

    }
}

Вот моя логика добавления новых записей. Из моего контроллера я сначала перемещаю центры в список типа PatientCentre, а затем передаю их на уровень данных для обработки.

    public async Task<Patient> CreatePatientV22(Patient patientForCreation, List<PatientCentre> patientCentres)
    {
        _context.Patients.Add(patientForCreation);

        if (patientCentres.Count > 0)
        {
            foreach (var item in patientCentres)
            {
                var patientCentre = new PatientCentre
                {
                    CentreId = item.CentreId,
                    PatientId = patientForCreation.Id
                };
                patientForCreation.PatientCentres.Add(patientCentre);
            }                
        }

        await _context.SaveChangesAsync();

        return patientForCreation;
    }

У меня также есть изменения сохранения, поскольку я выполняю мягкое удаление на столе пациента,

Исключение, которое я получил в своей трассировке стека: System.InvalidOperationException: не удалось найти свойство IsDeleted для типа сущности PatientCentre. Убедитесь, что свойство существует и включено в модель.

Я понимаю, что ошибка понятна, но для меня не имеет особого смысла включать столбец isDeleted на соединении (PatientCentre)стол, потому что после того, как у пациента установлен флажок, я не вижу записи. Я попытался проверить похожие случаи в Интернете, в которых также реализованы отношения «многие ко многим» и «мягкое удаление», но безрезультатно.

Кажется, довольно много кода, чтобы показать, но я просто хотел уточнить, что у меня есть и как лучше, чтобы кто-нибудь мог дать мне идею, как решить эту проблему.

Пожалуйста, как лучшемогу ли я продолжить это.

Ценю любые отзывы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...