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

时间:2015-01-27 18:29:47

标签: c# .net 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; }
}

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

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

Mapper.Map(productViewModel, product);

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

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

注意:

  • 我遇到了Using Automapper to update an existing Entity POCO
  • 如果我们对排除的属性使用隐藏字段,则会修复上述问题,因为 viewmodel 将使用隐藏字段来携带数据。但我不喜欢它!
  • 我尝试了以下不起作用的代码:

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

编辑:

我尝试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 时,我收到错误。

任何线索?

2 个答案:

答案 0 :(得分:6)

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

我写了这个工具,我从来没有这样做过。你有集合,延迟加载的实体,提取,合并,加载,以及许多可能出错的事情。

只需。唐&#39;吨。做吧。

答案 1 :(得分:1)

我已修复此问题,方法是在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