C# 忽略使用Automapper映射一个属性

C# 忽略使用Automapper映射一个属性,c#,model,viewmodel,automapper,object-object-mapping,C#,Model,Viewmodel,Automapper,Object Object Mapping,我正在使用Automapper,我有以下场景: 类OrderModel有一个名为“ProductName”的属性,该属性不在数据库中。 因此,当我尝试使用以下工具进行映射时: Mapper.CreateMap<OrderModel, Orders>(); Mapper.CreateMap(); 它会生成一个异常: “Project.ViewModels.OrderModel上的以下1属性未映射:'ProductName' 我读过相反的案例(额外属性在目的地上,而不是在实际是我案

我正在使用Automapper,我有以下场景: 类OrderModel有一个名为“ProductName”的属性,该属性不在数据库中。 因此,当我尝试使用以下工具进行映射时:

Mapper.CreateMap<OrderModel, Orders>(); 
Mapper.CreateMap();
它会生成一个异常:

“Project.ViewModels.OrderModel上的以下1属性未映射:'ProductName'

我读过相反的案例(额外属性在目的地上,而不是在实际是我案例的源中)


如何避免automapper对此属性进行映射?

来自Jimmy Bogard:
CreateMap().formMember(x=>x.Blarg,opt=>opt.Ignore());

它位于。

现在(AutoMapper 2.0)有一个
IgnoreMap
属性,我将使用它,而不是有点重的流畅语法。

您可以这样做:

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.Ignore());
conf.CreateMap()
.ForSourceMember(x=>x.SourceProperty,y=>y.Ignore());
或者,在最新版本的Automapper中,您只需要告诉Automapper不要验证字段

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.DoNotValidate());
conf.CreateMap()
.ForSourceMember(x=>x.SourceProperty,y=>y.DoNotValidate());

对于试图自动执行此操作的任何人,您可以使用该扩展方法忽略目标类型上不存在的属性:

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var sourceType = typeof(TSource);
    var destinationType = typeof(TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
        && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}
public静态IMappingExpression ignoreallnoexisting(此IMappingExpression表达式)
{
var sourceType=typeof(TSource);
var destinationType=typeof(TDestination);
var existingMaps=Mapper.GetAllTypeMaps().First(x=>x.SourceType.Equals(SourceType)
&&x.DestinationType.Equals(DestinationType));
foreach(existingMaps.GetUnmappedPropertyNames()中的var属性)
{
expression.ForMember(属性,opt=>opt.Ignore());
}
返回表达式;
}
按如下方式使用:

Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
Mapper.CreateMap().IgnoreAllNonExisting();
感谢Can Gencer提供的提示:)

资料来源:

我可能有点完美主义;我不太喜欢FormMember(…,x=>x.Ignore())语法。这是一件小事,但对我来说很重要。我编写这个扩展方法是为了让它变得更好:

public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map,
    Expression<Func<TDestination, object>> selector)
{
    map.ForMember(selector, config => config.Ignore());
    return map;
}
publicstaticimappingexpression忽略(
这个IMappingExpression映射,
表达式选择器)
{
map.ForMember(选择器,config=>config.Ignore());
返回图;
}
它可以这样使用:

Mapper.CreateMap<JsonRecord, DatabaseRecord>()
        .Ignore(record => record.Field)
        .Ignore(record => record.AnotherField)
        .Ignore(record => record.Etc);
Mapper.CreateMap()
.Ignore(记录=>record.Field)
.Ignore(记录=>record.AnotherField)
.Ignore(record=>record.Etc);

您也可以重写它以使用
params
,但我不喜欢加载lambda的方法的外观。

将视图模型映射回域模型时,只需验证源成员列表而不是目标成员列表,就可以更干净

Mapper.CreateMap<OrderModel, Orders>(MemberList.Source); 
Mapper.CreateMap(MemberList.Source);

现在我的映射验证没有失败,每次我向我的域类添加属性时都需要另一个
Ignore()

大家好,请使用它,它工作正常…对于自动映射程序,请在C#中使用multiple.ForMember

if(promotionCode.Any())
{
Reset();
Mapper.CreateMap().formMember(d=>d.serverTime,o=>o.MapFrom(s=>s.promotionCodeId==null?“日期”:String.Format({0:dd/MM/yyyyy h:MM:ss tt}),DateTime.UtcNow.AddHours(7.0)))
.ForMember(d=>d.day,p=>p.MapFrom(s=>s.code!=“LeftTime(Convert.ToInt32(s.quantity),Convert.ToString(s.expiryDate),Convert.ToString(DateTime.UtcNow.AddHours(7.0)):“day”))
.FormMember(d=>d.subCategory名称,o=>o.MapFrom(s=>s.subCategory ID==0?“:Convert.ToString(subCategory.Where(z=>z.subCategory ID.Equals(s.subCategory ID)).FirstOrDefault().subCategory名称)))
.FormMember(d=>d.optionalCategoryName,o=>o.MapFrom(s=>s.optCategoryId==0?“:Convert.ToString(optionalCategory.Where(z=>z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName)))
.FormMember(d=>d.logoImg,o=>o.MapFrom(s=>s.vendorId==0?“:转换.ToString(vendorImg.Where(z=>z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg)))
.ForMember(d=>d.expiryDate,o=>o.MapFrom(s=>s.expiryDate==null?“:String.Format(“{0:dd/MM/yyyyy h:MM:ss tt}”,s.expiryDate));
var userPromotionModel=Mapper.Map(promotionCode);
返回userPromotionModel;
}
返回null;

可能在需要忽略的属性上使用IgnoreAttribute

Automapper不这样工作。它只关心目标对象上的属性。src可以包含100个额外属性--Automapper只映射dest属性。一定是其他原因导致映射异常。您可以发布一些cod吗什么不起作用?它会自动执行你的要求。发布一些代码来澄清一下下面的帖子,这些可能会帮助你@Patrick AutoMapper在分析方法/属性名称时做一些技巧。有可能源上有一个属性被无意地映射,即使没有完全匹配目标。这就是为什么存在ForSourceMember(…Ignore())为了防止这种情况发生。忽略属性通过应用程序泄漏自动映射器。AutoPuffer-1是一个我不介意到处泄漏的东西。)您可以总是考虑导出<代码> DimeAppAtgult。这是一个忽略跨多个对象继承的BASIC属性的好方法。在每个映射配置中都可以忽略它。automapper是否有ForSourceMember扩展?我目前正在这样做,但最好不必创建所有这些忽略…:/你知道在实际执行映射而不是创建映射时是否有忽略的方法吗?对于问题中给出的场景,这应该是
        if (promotionCode.Any())
        {
            Mapper.Reset();
            Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0))))
                .ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day"))
                .ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName)))
                .ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName)))
                .ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg)))
                .ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate))); 
            var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode);
            return userPromotionModel;
        }
        return null;