我在项目和员工实体上有关系。我需要使用 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;
}
指导我如何克服这个错误
遇到的错误表明该问题源于数据库中不存在任何员工为该项目分配的员工Id。
这种情况下,如果通过API触发指定的服务方法,并且请求体中提供的“updatedProject.employeeID”的值对于任何员工都不存在,就会出现此错误。
还有一种可能的情况是,如果创建员工后触发该服务方法,并且该新创建的员工正在分配到项目中。如果员工尚未保存在数据库中,也可能会导致同样的问题。因此,确保在成功保存员工后保存此类更改可以防止这种情况。