使用 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 和默认 属性 值?
备注:
- 我遇到了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 时,出现错误。
有什么线索吗?
不要使用 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
我有下面的 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 和默认 属性 值?
备注:
- 我遇到了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 时,出现错误。
有什么线索吗?
不要使用 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