【问题标题】:Deleting missing descendant on Update在更新时删除丢失的后代
【发布时间】:2021-02-10 22:30:08
【问题描述】:

我的控制器中有以下方法:

[HttpPost]
public async Task<ActionResult<ChartsCategoryDto>> PostChartsCategory(ChartsCategoryDto chartsCategory)
{
    try
    {
        var category = _mapper.Map<ChartsCategoryDto, ChartsCategory>(chartsCategory);
        if (category.Id == 0)
        {
            category = _context.ChartsCategories.Add(category).Entity;
            await _context.SaveChangesAsync();
            return CreatedAtAction("GetChartsCategory", new { id = category.Id }, _mapper.Map<ChartsCategory, ChartsCategoryDto>(category));
        }
        else
        {
            _context.ChartsCategories.Update(category);
            await _context.SaveChangesAsync();
            return NoContent();
        }
    }
    catch (Exception)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, "Error updating data");
    }
}

它应该处理名为ChartsCategory 的实体的创建和更新,该实体具有Charts 的集合:

public partial class ChartsCategory
{
    public ChartsCategory()
    {
        Charts = new HashSet<Chart>();
        InverseParent = new HashSet<ChartsCategory>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Label { get; set; }
    public string Icon { get; set; }
    public int? ParentId { get; set; }

    public virtual ChartsCategory Parent { get; set; }
    public virtual ICollection<Chart> Charts { get; set; }
    public virtual ICollection<ChartsCategory> InverseParent { get; set; }
}
  1. 当我创建一个新实体时 - 一切都按预期工作。
  2. 当我更新现有实体时 - 一切正常。
  3. ChartCategory 中更新或创建单数 Chart - 符合预期。
  4. ChartsCategory 中删除Chart 不起作用。

我希望Update() 功能可以删除丢失的项目。 我找到了this 的答案,但它似乎有点太明确了。我想全局声明必须发送后代项目,否则应将其删除。

谢谢

【问题讨论】:

  • 从这个docs.microsoft.com/en-us/dotnet/api/… 你看到Update 方法不是那么神奇,它只能处理ModifiedAdded 状态,没有Deleted 或自动设置可选的FK到 null 被处理。你必须自己决定这个逻辑。最自然的方法是包含父实体的集合导航并删除它们中的每一个以使跟踪正常工作。但是当集合很大时,这可能不合适。出于性能原因,您甚至可能不得不使用原始脚本。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我认为在第一种情况下,检索到的用户没有被上下文跟踪。


 _context.ChartsCategories.AsNoTrcking.Remove(category);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-12-10
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2019-01-26
    • 2016-03-16
    相关资源
    最近更新 更多