自动捕获意外字段c#

本文关键字:字段 意外 | 更新日期: 2023-09-27 18:07:06

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

saveimporttrundetailsmodel -> importtrundetailentity (Destination成员)fcsd . models . saveimporttrundetailsmodel ->llblgen . entityclasses . importtrundetailentity(目标成员列表)

地图上未标明的属性:

Id
ConcurrencyPredicateFactoryToUse
AuthorizerToUse
AuditorToUse
Validator
ActiveContext
IsNew
Fields
IsDirty

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

AutomapperCfg.cs is

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();
        }
    }
}

saveimporttrundetailsmodel是

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

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

自动捕获意外字段c#

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中的"auto"去掉了,所以你可能想考虑这样的东西:AutoMapper: "忽略其余的"?-它将自动忽略源对象上不存在的所有目标成员。

还有一件事

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