FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

jsonmap 使用automapper的时候不能自动更新

Open sukney opened this issue 2 years ago • 9 comments

freesql 版本3.2.650-preview20220515 jsonmap 映射的字段 使用automapper 不能更新字段值 我的entity如下:

[Table(Name = "bill_product")]
    public class Product: FullEntity
    {
        /// <summary>
        /// 名称
        /// </summary>
        [Display(Name = "名称")]
        [Required(ErrorMessage = "{0}是必填字段")]
        [StringLength(50, MinimumLength = 1, ErrorMessage = "{0}的长度必须在{2}至{1}个字符之间")]
        public string? Name { get; set; }


        /// <summary>
        /// 图片
        /// </summary>
        [Display(Name = "图片")]
        [JsonMap]
        public List<string>? Images { get; set; }



        /// <summary>
        /// 说明
        /// </summary>
        [Display(Name = "说明")]
        [MaxLength(255,  ErrorMessage = "{0}的长度必须在{1}个字符以内")]
        public string? Description { get; set; }


    }
   public class ProductAddRequest
    {
        /// <summary>
        /// 名称
        /// </summary>
        [Display(Name = "名称")]
        [Required(ErrorMessage = "{0}是必填字段")]
        [StringLength(50, MinimumLength = 1, ErrorMessage = "{0}的长度必须在{2}至{1}个字符之间")]
        public string? Name { get; set; }


        /// <summary>
        /// 说明
        /// </summary>
        [Display(Name = "说明")]
        [MaxLength(255, ErrorMessage = "{0}的长度必须在{1}个字符以内")]
        public string? Description { get; set; }


        /// <summary>
        /// 图片
        /// </summary>
        [Display(Name = "图片")]
        public List<string>? Images { get; set; }
    }

    public async Task<IResult> CreateAsync(ProductAddRequest req)
        {
            var item = _mapper.Map<Product>(req);
            item.Images = req.Images;   //不手工赋值,不能更新images 字段。
            var result = await _productRepository.InsertAsync(item);
         
            return ResultDTO.Ok();
        }

不管是新增,还是更新,,images 不手工赋值一次均不能更新字段的值。

sukney avatar May 21 '22 23:05 sukney

是指 Update 还是 Insert ?

2881099 avatar May 22 '22 02:05 2881099

insert update 都不能赋值这个字段,必须手工= 赋值一下。

sukney avatar May 22 '22 02:05 sukney

这不是 _mapper 的问题么

2881099 avatar May 22 '22 03:05 2881099

var entity = await _productRepository.Select.Where(r => r.Id == req.Id).ToOneAsync(); _mapper.Map(req, entity); // entity.Images = req.Images; await _productRepository.UpdateAsync(entity); return ResultDTO.Ok("更新成功");

sukney avatar May 22 '22 04:05 sukney

已知:更新确实不行,因为它是引用类型

但是插入可以

2881099 avatar May 22 '22 04:05 2881099

这个和内部对比状态机制有关,内部直接使用 == 判断的,引用类型即使变化了 == 也是相等。

2881099 avatar May 22 '22 04:05 2881099

谢谢,这种情况有没有好的挽救方法,不想每个这样的地方都要重新赋值一下。

sukney avatar May 22 '22 04:05 sukney

这个问题已知3年了,没有很好的办法解决,因为仓储内部无法判断引用类型来决定是否更新。

2881099 avatar May 22 '22 04:05 2881099

这个问题已知3年了,没有很好的办法解决,因为仓储内部无法判断引用类型来决定是否更新。

方法一:将对象转JSON后比较字符串 方法二:更新时增加一个是否强制更新 JsonMap 字段的参数

方式一有点点性能损耗,我觉得非高性能场景可能可以忽略 方法二则不能自动更新字段,需要人工设置,但是设计人员自己最清楚,自己的 JsonMap 是否需要更新,所以这个方法可能更好

woodcoal avatar Jun 09 '22 01:06 woodcoal

目前新文档,聚合根实验室,有深度比较的机制。

2881099 avatar Oct 02 '22 17:10 2881099