ASP.NET Entity Framework Core — ограничение внешнего ключа связи «один ко многим», блокирующее запрос PUT

У меня есть отношения по проекту и сотрудникам. Мне нужно добавить связь «один ко многим», используя Entity Framework Core (у одного сотрудника есть много проектов, но у одного проекта есть один сотрудник). Запросы на получение, публикацию и удаление работают нормально, но запрос на обновление не выполняется.

Это моя сущность проекта:

using HRM_API.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace HRM_API.Entities
{
    public class Project
    {
        [Key]
        public Guid ProjectID { get; set; }

        [MaxLength(1000)]
        public string? ProjectTitle { get; set; }

        [MaxLength(1000)]
        public string? Description { get; set; }

        [Column("fk_emp_id")]
        public Guid? employeeID { get; set; }

        //Navigation Properties
        public Employee? employee { get; set; }
    }
}

Это мой сотрудник:

using HRM_API.Entities;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace HRM_API.Entity
{
    public class Employee
    {
        [Key]
        public Guid EmpId { get; set; }

        [MaxLength(200)]
        public string? FirstName { get; set; }

        [MaxLength(200)]
        public string? MiddleName { get; set; }

        [MaxLength(600)]
        public string? FullName { get; set; }

        // Navigation Properties
        public ICollection<Project> projects { get; set; } = new List<Project>();
    }
}

Это соотношение в DbContext:

//employee and project relationship one to many
modelBuilder.Entity<Employee>()
            .HasMany(e => e.projects)
            .WithOne(q => q.employee)
            .HasForeignKey(q => q.employeeID)
            .OnDelete(DeleteBehavior.SetNull);

Когда я обновляю детали проекта, он выдает это исключение:

Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении.

Microsoft.Data.SqlClient.SqlException (0x80131904): инструкция UPDATE конфликтует с ограничением FOREIGN KEY «FK_projects_employees_fk_emp_id». Конфликт произошел в базе данных «HRM-DB», таблица «dbo.employees», столбец «EmpId».

Кроме того, это обновленный запрос dto:

using System.ComponentModel.DataAnnotations;

namespace HRM_API.Models.Project
{
    public class UpdateProjectDto
    {
        [Required]
        [MinLength(4)]
        [MaxLength(1000)]
        public string? ProjectTitle { get; set; }

        [Required]
        public Guid EmpId { get; set; }

        [Required]
        [MinLength(4)]
        [MaxLength(1000)]
        public string? Description { get; set; }
    }
}

Это метод репозитория для обновления проекта:

public async Task<Project> UpdateProjectByID(Guid projectID, Project updatedProject )
{
     Project existing = await FindProjectByID(projectID);

     existing.ProjectTitle = updatedProject.ProjectTitle;
     existing.Description = updatedProject.Description;
     existing.employeeID = updatedProject.employeeID;

     await dbContext.SaveChangesAsync();
     return existing;
}

Подскажите, как побороть эту ошибку

Вы проверили updatedProject.employeeID? Исключение довольно очевидно.

Gert Arnold 26.06.2024 19:59

Переданный вами идентификатор сотрудника не соответствует сотруднику в вашей таблице. Простыми виновниками этого являются проблемы с привязкой на стороне клиента, когда переданное значение было привязано/заполнено неправильным свойством (т. е. передача ProjectId в качестве идентификатора сотрудника) или иным образом делало значение недействительным, например, путем передачи Guid.Empty.

Steve Py 26.06.2024 23:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обнаруженная ошибка указывает на то, что проблема связана с тем, что идентификатор сотрудника, назначенный для проекта, не существует в базе данных ни для одного сотрудника.

В этом случае, если указанный метод службы запускается с использованием API, а значение «updatedProject.employeeID», указанное в теле запроса, не существует ни для одного сотрудника, возникает эта ошибка.

Другой возможный сценарий: этот метод службы запускается после создания сотрудника, и этот вновь созданный сотрудник назначается проекту. Если сотрудник еще не сохранен в базе данных, это также может привести к той же проблеме. Таким образом, обеспечение сохранения таких изменений после успешного сохранения сотрудника может предотвратить такую ​​ситуацию.

И еще небольшая хитрость: используйте ключевое слово «виртуальный» в свойствах навигации, это включит отложенную загрузку. Это указывает EF Core создавать прокси-классы во время выполнения для выполнения отложенной загрузки при доступе к свойствам навигации.

YBB 27.06.2024 15:13

Другие вопросы по теме