asp.net 我正在使用AutoMapper,当我更新一个值时,它会使其余的值为空

xxls0lw8  于 2023-03-31  发布在  .NET
关注(0)|答案(1)|浏览(134)

我正在使用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; }
    }
}
jbose2ul

jbose2ul1#

所以你的Customer上的大部分数据都是可以为空的,你没有添加CustomerDTO,但我可以假设属性的名称与Customer中的相同。

{
   "Name": John
}

因此,从它创建的CustomerDTO看起来像这样:

{
    PhoneNumber = null,
    Name = "John",
    Email = null,
    Gender = null,
    DateOfBirth = new DateTime(), // not nullable so assigns default value 01/01/0001 00:00:00,
    CustomerData = null
}

Map后,您执行的值将相同,并将保存到数据库中。这是更新请求的一般工作方式。您正在获取旧对象,更改一个(或多个)值,并传递具有更改值的新对象。
如果你想像现在这样改变一个值,你应该看看:https://learn.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-7.0
在我看来,实现JsonPatch不值得花时间,除非你需要确保两个用户所做的更改不会被覆盖。在其他情况下,简单的更新就足够了,你应该改变你使用API的方式-传递所有需要的数据。

相关问题