我正在使用AutoMapper,这是我的代码来更新现有客户的详细信息,但当我更新一个字段时,其余的字段将为空。
public async Task<ResponseModel> Update(CustomerDTO customer, int id)
{
ResponseModel responseModel = new ResponseModel();
try
{
Customer? existingCustomer = await _dbContext.FindAsync<Customer>(id);
if (existingCustomer == null)
{
return new ResponseModel()
{
IsSuccess = false,
Message = $"Customer doesn't exist!"
};
}
_mapper.Map(customer, existingCustomer);
if (await _dbContext.SaveChangesAsync() > 0)
{
responseModel.Message = "Customer Updated Successfully";
responseModel.IsSuccess = true;
}
}
catch (Exception ex)
{
responseModel.IsSuccess = false;
responseModel.Message = $"Error:{ex.Message}";
}
return responseModel;
}
下面是mapper配置文件:
using AutoMapper;
using static MGApi.Services.CustomerService;
namespace MGApi.Models
{
public class CustomerProfile : Profile
{
public CustomerProfile()
{
CreateMap<CustomerDTO, Customer>();
}
}
}
我尝试使用ForAllOtherMembers
添加,但它已被弃用。我不知道如何解决这个问题。
以下是客户模型:
using System.ComponentModel.DataAnnotations;
namespace MGApi.Models
{
public class Customer
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(50)]
[RegularExpression(@"^\d{10}$", ErrorMessage = "Invalid phone number")]
public string? PhoneNumber { get; set; }
[Required]
[StringLength(50)]
public string? Name { get; set; }
[StringLength(100)]
[EmailAddress]
public string? Email { get; set; }
[StringLength(10)]
public string? Gender { get; set; }
[DataType(DataType.Date)]
public DateTime DateOfBirth { get; set; }
public ICollection<CustomerData>? CustomerData { get; set; }
}
}
下面我们有一个CustomerData模型,它有一个基于Customer模型主键的外键:
using System.ComponentModel.DataAnnotations;
namespace MGApi.Models
{
public class CustomerData
{
[Key]
public int Id { get; set; }
public int CustomerId { get; set; }
public double Sugar { get; set; }
public double BP { get; set; }
public double Height { get; set; }
public double Weight { get; set; }
public DateTime Timestamp { get; set; } = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
public Customer? Customer { get; set; }
}
}
1条答案
按热度按时间jbose2ul1#
所以你的
Customer
上的大部分数据都是可以为空的,你没有添加CustomerDTO
,但我可以假设属性的名称与Customer
中的相同。因此,从它创建的
CustomerDTO
看起来像这样:Map后,您执行的值将相同,并将保存到数据库中。这是更新请求的一般工作方式。您正在获取旧对象,更改一个(或多个)值,并传递具有更改值的新对象。
如果你想像现在这样改变一个值,你应该看看:https://learn.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-7.0
在我看来,实现
JsonPatch
不值得花时间,除非你需要确保两个用户所做的更改不会被覆盖。在其他情况下,简单的更新就足够了,你应该改变你使用API的方式-传递所有需要的数据。