【问题标题】:Why is SaveAllAsync() > 0 false in this case?为什么在这种情况下 SaveAllAsync() > 0 false?
【发布时间】:2020-05-22 13:03:02
【问题描述】:

SaveAll() 方法

    public async Task<bool> SaveAll()
    {
        return await _context.SaveChangesAsync() > 0;
    }

我的控制器中的 UpdateSteps 方法

    [HttpPut("{goalId}/steps")]
    public async Task<IActionResult> UpdateSteps(int userId, long goalId, IEnumerable<Step> steps)
    {
        if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
            return Unauthorized();

        var stepsFromRepo = await _repo.GetStepsById(goalId);

        _mapper.Map(steps, stepsFromRepo);

        if (await _repo.SaveAll())
            return NoContent();

        throw new Exception("Updating steps failed");
    }

如果条件为假并抛出异常

映射工作正常,这就是为什么我不明白为什么更改无法被识别。

非常感谢您的帮助!

【问题讨论】:

    标签: c# database http asp.net-web-api controller


    【解决方案1】:

    _mapper.Map(我假设您使用 AutoMapper)在使用集合时不会匹配任何 Id 并更新它。

    class Order { public int Id { get; set; } }
    class OrderDto { public int Id { get; set; } }
    
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
    var mapper = config.CreateMapper();
    
    var targ1 = new Order {Id = 1};
    var targ2 = new Order {Id = 2};
    var source = new List<Order> { new Order {Id = 1}};
    var target = new List<Order> { targ1, targ2 };
    mapper.Map(source, target);
    Console.WriteLine(object.ReferenceEquals(target.First(o => o.Id == 1), targ1)); // False - not the same object
    Console.WriteLine(target.Count()); // 1
    

    所以我假设await _repo.GetStepsById(goalId) 代码返回被跟踪实体的简单集合(不是被跟踪集合),而自动映射器基本上只是清除它并添加 EF(我假设你使用它)不知道的新项目,所以它不能插入或更新任何东西。

    您将需要手动更新/添加/删除所有相应的条目。或者也许有很好的包,但我不知道。也许AutoMapper.Collection.EntityFrameworkCore 有这样的功能,但我不确定。

    【讨论】:

    • 是的,就是这个:)
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2021-02-08
    • 2016-08-08
    相关资源
    最近更新 更多