FreeSql
FreeSql copied to clipboard
jsonmap 使用automapper的时候不能自动更新
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 不手工赋值一次均不能更新字段的值。
是指 Update 还是 Insert ?
insert update 都不能赋值这个字段,必须手工= 赋值一下。
这不是 _mapper 的问题么
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("更新成功");
已知:更新确实不行,因为它是引用类型
但是插入可以
这个和内部对比状态机制有关,内部直接使用 == 判断的,引用类型即使变化了 == 也是相等。
谢谢,这种情况有没有好的挽救方法,不想每个这样的地方都要重新赋值一下。
这个问题已知3年了,没有很好的办法解决,因为仓储内部无法判断引用类型来决定是否更新。
这个问题已知3年了,没有很好的办法解决,因为仓储内部无法判断引用类型来决定是否更新。
方法一:将对象转JSON后比较字符串 方法二:更新时增加一个是否强制更新 JsonMap 字段的参数
方式一有点点性能损耗,我觉得非高性能场景可能可以忽略 方法二则不能自动更新字段,需要人工设置,但是设计人员自己最清楚,自己的 JsonMap 是否需要更新,所以这个方法可能更好
目前新文档,聚合根实验室,有深度比较的机制。