عشان أعمل Update للـ Address
[Authorize]
[HttpPut("address")] // PUT : /api/accounts/address
public async Task<ActionResult<AddressDto>> UpdateUserAddress(AddressDto updatedAddress)
{
var address = _mapper.Map<AddressDto, Address>(updatedAddress);
// var email = User.FindFirstValue(ClaimsTypes.Email);
// var user = await _userManager.FindByEmailAsync(email);
// Because Navigational property
var user = await _userManager.FindUserWithAddressAsync(User);
user.Address = address; // Now it's Update not Insert
var result = await _userManager.UpdateAsync(user);
if(!result.Succeeded) return BadRequest(new ApiResponse(400));
return Ok(updatedAddress)
}
// AddressDto
// لازم نخلي كله مطلوب لو هو بيعمل واحد جديد بس الايدي مش لازم
// عشان كدا بنستخدم الدي تي او عشان نعمل الحاجات دي
[Required]
public string FirstName {get; set;}
[Required]
public string LastName {get; set;}
[Required]
public string Street {get; set;}
[Required]
public string Country {get; set;}
[Required]
public string City {get; set;}
// MappingProfiles
CreateMap<Address, AddressDto>().ReverseMap();
هدي Segment للـ URL عشان يبقا Logical Meaning واضح
الـ Address اللي جايلي هو AddressDto
وانا محتاج ابديت Address فمحتاج أعمل Reverse Map
خد بالك لو استخدمت FindByEmailAsync
العادية بيرجع الـ Address ب Null لان Navigational Property فانا لما احط الأدريس الجديد هيعتبره Address جديد خالص ودا مش صح
بس فيه مشكلة ان الـ Id مش مطلوب فوهو جاي بيبقا فاضي فبرضو وهو راجع هيبقا بصفر لأنه هو هو اللي جاي ودا لأن في الـ Update مش محتاجين الـ Id فمش محتاجين نبعته في الـ Request فحل الموضوع دا بما اننا كدا كدا مش هنستخدم Id ابدا فنشيله وخلاص من الـ Dto بس دا مش هيحل المشكلة اللي تحت بس هيحل مشكلة الـ Return لأن برضو باختصار انه لما بيعمل Mapping بيحط الـ Id بصفر فهو بيعتبره واحد جديد وبيعمل المشكلة اللي تحت
وبرضو فيه حاجة بالطريقة دي هو تقريبا بيمسح الـ Address القديم ويدي الـ Address الجديد Id جديد ويعمله من الأول
فأعتقد الحل انك لازم تعدي على كل Property وتعملها Update بايدك
user.Address.FirstName = address.FirstName;
user.Address.LastName = address.LastName;
user.Address.Street = address.Street;
user.Address.City = address.City;
user.Address.County = address.Country;
// Another Solution : Best Solution
address.Id = user.Address.Id; // Solve id = 0 problem
user.Address = address;
لاحظ الـ SQL Query اللي بتتنفذ لكل واحدة من دول وانت هتفهم الفرق