我有以下 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和默认属性值?
注意:
我尝试了以下不起作用的代码:
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 时,我收到错误。
任何线索?
答案 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