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

Updating existing domain model using AutoMapper sets NULL

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

public class ProductViewModel
{
    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string FullDescription { get; set; }
    public string AdminComment { get; set; }
}

从上面来看,我只使用了视图页面中的一些属性。

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

Mapper.Map(productViewModel, product);

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

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

备注:

编辑:

在我尝试 Automapper skip null values with custom resolver 之后(感谢 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; }

resolver 访问上述代码中的 BackInStockSubscriptions 时,出现错误。

有什么线索吗?

不要使用 AutoMapper 映射回您的领域模型。它更复杂,有太多边缘情况,而且它无法提供与映射读取模型相同的投资回报率。

我编写了该工具,但我从来没有这样做过。您有集合、延迟加载的实体、获取、合并、加载,很多事情都可能出错。

只是。不。做吧。

我已经通过在 AutoMapper 中添加 ICollection 属性来忽略列表来解决这个问题。

固定码:

Mapper.CreateMap<ProductViewModel, Product>()
        .ForMember(dest => dest.BackInStockSubscriptions, mo => mo.Ignore())
        .ForMember(dest => dest.OrderItems, mo => mo.Ignore())            
        .ForAllMembers(c => c.IgnoreIfSourceIsNull()); //To checking NULL