使用AutoMapper更新现有域模型设置为NULL

Raj*_* Sa 2 .net c# entity-framework automapper

我有下面的viewmodel,它与域模型相同(但包含一些额外的属性).

public class ProductViewModel
{
    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string FullDescription { get; set; }
    public string AdminComment { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从上面看,我只在视图页面中使用了一些属性.

当我使用Automapper映射我现有的模型时,我的所有viewmodel字段都被映射到domainmodel字段.

Mapper.Map(productViewModel, product);
Run Code Online (Sandbox Code Playgroud)

由于上面的映射,所有未使用的viewmodel字段(默认情况下未使用的viewmodel字段具有NULL值)都映射到域模型.它用NULL值替换我现有的数据库数据.

有没有办法从映射中排除NULL和默认属性值?

笔记:

  • 我遇到了使用Automapper来更新现有的实体POCO
  • 如果我们对排除的属性使用隐藏字段,则将修复上述问题,因为viewmodel将使用隐藏字段来携带数据.但我不喜欢它!
  • 我尝试了以下不起作用的代码:

    Mapper.CreateMap<ProductViewModel, Product>()
          .ForAllMembers(opt =>
               opt.Condition(srs => (!srs.IsSourceValueNull || IsDefaultValue(srs.SourceValue, srs.SourceType))));
    
    Run Code Online (Sandbox Code Playgroud)

编辑:

尝试Automapper后,使用自定义解析器跳过空值(感谢abatishchev).我已经使用了解析器,但得到错误缺少类型映射配置或不支持的映射

我的代码片段:

...
public System.DateTime CreatedOnUtc { get; set; }
public System.DateTime UpdatedOnUtc { get; set; }
public virtual ICollection<BackInStockSubscription> BackInStockSubscriptions { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
Run Code Online (Sandbox Code Playgroud)

解析器访问上面代码中的BackInStockSubscriptions时,我收到错误.

有线索吗?

Jim*_*ard 6

不要使用AutoMapper映射回您的域模型.它更复杂,有太多边缘情况,它只是没有提供与映射读取模型相同的ROI.

我写了这个工具,我从来没有这样做过.你有集合,延迟加载的实体,提取,合并,加载,这么多的东西都可能出错.

只是.别.做吧.

  • 那么我们如何将viewmodel数据更新回db呢?通过逐个属性映射属性?(因为我有 25 个属性,所以它的过程仪式非常冗长?) 注意:据我所知,许多用户正在使用 automapper 将视图模型数据映射到域模型。这些场景的最佳实践是什么? (2认同)
  • 谢谢吉米。但在我的上述情况下,你能建议我任何解决方案吗? (2认同)