使用外键的ASP.NET核心Web API
我正在为用户控制器开发Web Api操作,我不明白为什么在POST方法中会出现错误: 违反了主键约束的“PK_部分”。无法将重复键插入dbo.Section对象。重复的键值:(3fa85f64-5717-4562-b3fc-2c963f66afa4) My IdentityUser型号:使用外键的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;
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;
});