带有绑定功能的.net核心api更新

时间:2018-12-11 22:05:45

标签: .net .net-core entity-framework-core

我有一个用于管理体育运动的简单.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; }
}

0 个答案:

没有答案