C# 为什么在这种情况下SaveAllAsync()>0为false?
SaveAll方法 我的控制器中的UpdateSps方法 if条件为false并引发异常 映射工作正常,这就是为什么我不理解为什么更改无法被识别 非常感谢您的帮助 \u mapper.Map我假设您在处理集合时使用AutoMapper将不会按Id匹配任何内容并更新它C# 为什么在这种情况下SaveAllAsync()>0为false?,c#,database,http,asp.net-web-api,controller,C#,Database,Http,Asp.net Web Api,Controller,SaveAll方法 我的控制器中的UpdateSps方法 if条件为false并引发异常 映射工作正常,这就是为什么我不理解为什么更改无法被识别 非常感谢您的帮助 \u mapper.Map我假设您在处理集合时使用AutoMapper将不会按Id匹配任何内容并更新它 class Order { public int Id { get; set; } } class OrderDto { public int Id { get; set; } } var config = new MapperC
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
所以我假设wait _repo.GetStepsByIdgoalId代码返回的是被跟踪实体的简单集合,而不是被跟踪的集合,而automapper只是基本上清除它并添加新的项,我假设您使用它时不知道这些项,所以它不能插入或更新任何内容
您需要手动更新/添加/删除所有相应的条目。或者可能有很好的包装,但我不知道。也许有这样的功能,但我不确定。是的,就是这个:
[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");
}
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