У меня есть отношения по проекту и сотрудникам. Мне нужно добавить связь «один ко многим», используя 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;
}
Подскажите, как побороть эту ошибку
Переданный вами идентификатор сотрудника не соответствует сотруднику в вашей таблице. Простыми виновниками этого являются проблемы с привязкой на стороне клиента, когда переданное значение было привязано/заполнено неправильным свойством (т. е. передача ProjectId в качестве идентификатора сотрудника) или иным образом делало значение недействительным, например, путем передачи Guid.Empty.
Обнаруженная ошибка указывает на то, что проблема связана с тем, что идентификатор сотрудника, назначенный для проекта, не существует в базе данных ни для одного сотрудника.
В этом случае, если указанный метод службы запускается с использованием API, а значение «updatedProject.employeeID», указанное в теле запроса, не существует ни для одного сотрудника, возникает эта ошибка.
Другой возможный сценарий: этот метод службы запускается после создания сотрудника, и этот вновь созданный сотрудник назначается проекту. Если сотрудник еще не сохранен в базе данных, это также может привести к той же проблеме. Таким образом, обеспечение сохранения таких изменений после успешного сохранения сотрудника может предотвратить такую ситуацию.
И еще небольшая хитрость: используйте ключевое слово «виртуальный» в свойствах навигации, это включит отложенную загрузку. Это указывает EF Core создавать прокси-классы во время выполнения для выполнения отложенной загрузки при доступе к свойствам навигации.
Вы проверили
updatedProject.employeeID
? Исключение довольно очевидно.