Posted 27 September 2022, 10:13 pm EST
I test my app by postman:
statuscode:500
messsage: Value cannot be null. (Parameter ‘entity’)
details: at Microsoft.EntityFrameworkCore.Utilities.Check.NotNull[T](T value, String parameterName)\r\n at Microsoft.EntityFrameworkCore.DbContext.Entry[TEntity](TEntity entity)\r\n at API.Data.UserRepository.Update(AppUser user) in C:\Users\vu227\DatingApp\API\Data\UserRepository.cs:line 67\r\n at API.Controllers.UsersController.UpdateUser(MemberUpdateDto memberUpdateDto) in C:\Users\vu227\DatingApp\API\Controllers\UsersController.cs:line 51\r\n at lambda_method101(Closure , Object )\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()\r\n— End of stack trace from previous location —\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\r\n at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)\r\n at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)\r\n at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)\r\n at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)\r\n at API.Middleware.ExceptionMiddleware.InvokeAsync(HttpContext context) in C:\Users\vu227\DatingApp\API\Middleware\ExceptionMiddleware.cs:line 29"
AppUser
using System; using System.Collections.Generic; using API.Extensions;
namespace API.Entities { public class AppUser { public int Id { get; set; } public string UserName { get; set; } public byte[] PasswordHash { get; set; } public byte[] PasswordSalt { get; set; } public DateTime DateOfBirth { get; set; } public string KnownAs { get; set; } public DateTime Created { get; set; } = DateTime.Now; public DateTime LastActive { get; set; } = DateTime.Now; public string Gender { get; set; } public string Introduction { get; set; } public string LookingFor { get; set; } public string Interests { get; set; } public string City { get; set; } public string Country { get; set; } public ICollection Photos { get; set; } } }
public void Update(AppUser user) { _context.Entry(user).State = EntityState.Modified; } line 67 in UserRepostory is
_context.Entry(user).State = EntityState.Modified; Controller Put method looks like:
[HttpPut] public async Task UpdateUser(MemberUpdateDto memberUpdateDto) { var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity; var username = claimsIdentity.Name; var user = await _userRepository.GetUserByUsernameAsync(username);
_mapper.Map(memberUpdateDto, user); _userRepository.Update(user); if (await _userRepository.SaveAllAsync()) return NoContent(); return BadRequest("Failed to update user"); }
Line 51 is
_userRepository.Update(user);
MemberUpdateDto:
namespace API.DTOs { public class MemberUpdateDto { public string Introduction { get; set; } public string LookingFor { get; set; } public string Interests { get; set; } public string City { get; set; } public string Country { get; set; }
}
} Mapper:
public class AutoMapperProfiles : Profile { public AutoMapperProfiles() { CreateMap<AppUser, MemberDto>() .ForMember(dest => dest.PhotoUrl, opt => opt.MapFrom(src => src.Photos.FirstOrDefault(x => x.IsMain).Url)) .ForMember(dest => dest.Age, opt => opt.MapFrom(src => src.DateOfBirth.CalculateAge()));; CreateMap<Photo, PhotoDto>(); CreateMap<MemberUpdateDto, AppUser>(); } }