使用外键的ASP.NET核心Web API

使用外键的ASP.NET核心Web API,api,asp.net-core,post,foreign-keys,Api,Asp.net Core,Post,Foreign Keys,我正在为用户控制器开发Web Api操作,我不明白为什么在POST方法中会出现错误: 违反了主键约束的“PK_部分”。无法将重复键插入dbo.Section对象。重复的键值:(3fa85f64-5717-4562-b3fc-2c963f66afa4) My IdentityUser型号: public string MiddleName { get; set; } [Required] public string Surname { get;

我正在为用户控制器开发Web Api操作,我不明白为什么在POST方法中会出现错误:

违反了主键约束的“PK_部分”。无法将重复键插入dbo.Section对象。重复的键值:(3fa85f64-5717-4562-b3fc-2c963f66afa4)

My IdentityUser型号:


        public string MiddleName { get; set; }

        [Required]
        public string Surname { get; set; }

        public DateTime BirthDate { get; set; }

        public string Address { get; set; }

        [Required]
        public string UserType { get; set; }
        public bool ParentsAgreement { get; set; }

        public Section BelongSection { get; set; }
    
截面模型:

        [Required]
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string CoachName { get; set; }
        public string SportComplexTitle { get; set; }
        [IgnoreDataMember]
        public ICollection<User> UsersList { get; set; }

可以使用以下两种方法将现有子级添加到父级:

_context.Section.Attach(user.BelongSection);
services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

}); 
或:

确保添加
AsNoTracking()
以显示结果

以下是整个工作演示:

[HttpPost]
public async Task<ActionResult<User>> Add(User user)
{
    try
    {
        if (user == null)
        {
            return BadRequest();
        }
        //_context.Section.Attach(user.BelongSection);
        _context.Entry(user.BelongSection).State = EntityState.Unchanged;

        _context.Users.Add(user);
        await _context.SaveChangesAsync();


        var result = await _context.Users.Include(o => o.BelongSection)
                                   .AsNoTracking()
                                   .FirstOrDefaultAsync(o=> o.Id == user.Id);
        return result;

    }
    catch (Exception)
    {
        throw;
    }
}
在.NET5.0中,您还可以添加Newtonsoft支持。此外,
System.Text.Json
允许将
ReferenceHandler
设置为
Preserve

_context.Section.Attach(user.BelongSection);
_context.Entry(user.BelongSection).State = EntityState.Unchanged;
[HttpPost]
public async Task<ActionResult<User>> Add(User user)
{
    try
    {
        if (user == null)
        {
            return BadRequest();
        }
        //_context.Section.Attach(user.BelongSection);
        _context.Entry(user.BelongSection).State = EntityState.Unchanged;

        _context.Users.Add(user);
        await _context.SaveChangesAsync();


        var result = await _context.Users.Include(o => o.BelongSection)
                                   .AsNoTracking()
                                   .FirstOrDefaultAsync(o=> o.Id == user.Id);
        return result;

    }
    catch (Exception)
    {
        throw;
    }
}
services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

});