我有一个用于管理体育运动的简单.net核心API。其中一个API会使用 sportId 作为参数以及 Sports 模型本身来编辑运动模型。 Bind属性用于允许 SportsMasterId 的所有属性除外,这是我不想更新的字段。
收到对此API的发布请求后,它将按预期工作,并且所有属性均具有值,除了 SportsMasterId 之外,该值设置为空的GUID(全0)。
但是,当尝试更新数据库中的模型时,我收到错误消息:
UPDATE语句与FOREIGN KEY约束“ FK_Sports_SportsMaster_SportsMasterId”冲突。在数据库“运动员注册”,表“ dbo.SportsMaster”,列“ sportsMasterId”中发生了冲突。
下面是.net core尝试使用的查询,并且它正在尝试修改 SportsMasterId 。
UPDATE [Sports] SET
[SeasonId] = @p0
, [SportsMasterId] = @p1
, [description] = @p2
, [endDate] = @p3
, [name] = @p4
, [signupEndDate] = @p5
, [signupStartDate] = @p6
, [startDate] = @p7
WHERE [sportsId] = @p8;
我正在寻找-并期望-的是我在“绑定”中指定的要更新的字段。但是,另一个字段 SportsMasterId 根本不会更新。
我知道要解决此问题,我可以将 SportsMasterId 的值替换为数据库中当前的任何值。或者,我可以将该字段标记为未修改。但是我觉得我不必这样做,因为这增加了很多额外的样板代码。我觉得必须有一种更简单的方法。...
[HttpPost]
public async Task<IActionResult> Edit(Guid id, [Bind("sportsId,SeasonId,name,description,startDate,endDate,signupStartDate,signupEndDate")] Sports sports)
{
if (id != sports.sportsId) return NotFound();
if (ModelState.IsValid)
{
try
{
await _athleticContext.Update(sports);
await _athleticContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{ throw new Exception("Sport was not found"); }
}
return RedirectToAction(nameof(Index));
}
public class Sports
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid sportsId { get; set; }
public Guid SportsMasterId { get; set; }
[ForeignKey("SportsMasterId")]
public virtual SportsMaster SportsMaster { get; set; }
public Guid SeasonId { get; set; }
[ForeignKey("SeasonId")]
public virtual Seasons Season { get; set; }
[DisplayName("Name")]
public string name { get; set; }
[DisplayName("Description")]
public string description { get; set; }
public DateTime? startDate { get; set; }
public DateTime? endDate { get; set; }
public DateTime? signupStartDate { get; set; }
public DateTime? signupEndDate { get; set; }
}