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>();
}
}