3

我正在尝试将一个简单的模型映射到一个实体,但得到一个我没想到的未映射项目列表,它在 AutomapperCfg 的验证行失败:

SaveImportRunDetailsModel -> ImportRunDetailEntity(目标成员列表) FCSD.Models.SaveImportRunDetailsModel -> LLBLGEN.EntityClasses.ImportRunDetailEntity(目标成员列表)

未映射的属性:

Id
ConcurrencyPredicateFactoryToUse
AuthorizerToUse
AuditorToUse
Validator
ActiveContext
IsNew
Fields
IsDirty

这些看起来像系统生成的项目,有没有办法消除它们?

AutomapperCfg.cs 是

using AutoMapper;
using FCSD.Models;
using LLBLGEN.EntityClasses;

namespace FCSD.Automapper
{
    public class AutomapperCfg : IAutomapperCfg
    {
        public void Configure()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<CategoryEntity, Category>(MemberList.Destination);
                cfg.CreateMap<EnglishPartInfoEntity, EnglishPartModel>(MemberList.Destination);
                cfg.CreateMap<ImageEntity, Image>(MemberList.Destination);
                cfg.CreateMap<ImportRunDetailEntity, ImportRunDetailModel>(MemberList.Destination);
                cfg.CreateMap<ModelExportBaseEntity, Model>(MemberList.Destination).ReverseMap();
                cfg.CreateMap<PartEntity, Part>(MemberList.Destination);

                cfg.CreateMap<SaveImportRunDetailsModel, ImportRunDetailEntity>(MemberList.Destination);
            });

            Mapper.AssertConfigurationIsValid();
        }
    }
}

SaveImportRunDetailsModel 是

using System;

namespace FCSD.Models
{
    public class SaveImportRunDetailsModel
    {
        public string PHCreationDate { get; set; }
        public DateTime RunTimestamp { get; set; }
    }
}

最后,ImportRunDetailEntity 有点长(超过 400 行)并且是从 LLBLGen Pro 自动生成的 c#。

4

1 回答 1

1

发生了什么

如果您的目标类型包含任何无法与源上的属性匹配的属性,并且没有明确告知如何填充该属性,AutoMapper 将引发异常。

如何修复它

如果您不希望 AutoMapper 填充属性,则应在CreateMap<TSource, TDest>()返回时使用此扩展方法,以便忽略每个字段:

 .ForMember(dest => dest.Id, opt => opt.Ignore())
 .ForMember(dest => dest.ConcurrencyPredicateFactoryToUse, opt => opt.Ignore())
 .ForMember(dest => dest.AuthorizerToUse, opt => opt.Ignore());

等等。

但这很糟糕...

显然,这有点拖累,并将“自动”从 AutoMapper 中取出,所以您可能需要考虑类似这样的 AutoMapper:“忽略其余部分”?- 这将自动忽略源对象上不存在的所有目标成员。

还有一件事

您可能想编写一个单元测试,Mapper用您的所有映射配置一个实例,然后Mapper.AssertConfigurationIsValid()在测试时而不是在运行时调用以发现任何问题,因为默认情况下,AutoMapper 不会打扰验证映射,直到您第一次尝试用它。

于 2015-08-10T11:52:23.940 回答