您能告诉AutoMapper在映射时全局忽略缺失的属性吗?

时间:2012-11-13 12:24:24

标签: c# automapper

我有很多实体,到目前为止,我一直在做像

这样的事情
Mapper.CreateMap<Employee, EmployeeDetailsDTO>()
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore());

我想告诉AutoMapper简单地忽略目标对象中缺少的属性,而不必指定它们中的每一个。到目前为止,我还没有找到一种方法可以使用我的多个SO和Google搜索。有人有解决方案吗?我已经准备好做某种循环或任何事情,只要它可以写一次,并且它将随着模型/ dto更改或添加属性而缩放。

3 个答案:

答案 0 :(得分:10)

你什么时候收到错误?是在你拨打AssertConfigurationIsValid吗?

如果是,那么根本不会调用此方法

您不必调用此方法,请考虑以下映射:

public class Foo1
{
    public string Field1 { get; set; }
}
public class Foo2
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

Mapper.CreateMap<Foo1, Foo2>();
var foo1 = new Foo1() {Field1 = "field1"};
var foo2 = new Foo2();
Mapper.Map(foo1, foo2);//maps correctly, no Exception

您可能需要为{em>其他映射调用AssertConfigurationIsValid以确保它们是正确的,因此您需要做的是将映射组织到配置文件中:

public class MyMappedClassesProfile: Profile
{
    protected override void Configure()
    {
        CreateMap<Foo1, Foo2>();
        //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap
        //I made this mistake when migrating 'static' mappings to a Profile.    
    }
}

Mapper.AddProfile<MyMappedClassesProfile>();

然后如果您决定要检查映射的有效性(根据您的具体情况而定),请致电

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName);

重要在您的情况下和/或您调用AssertConfigurationIsValid的任何情况下,您应该使用类似AutoFixture和单元测试的内容确保您的映射正常工作。 (这是AssertConfigurationIsValid

的意图

答案 1 :(得分:6)

建议wal's answer&#34;不要调用AssertConfigurationIsValid()&#34;是不安全的,因为它会隐藏映射中的潜在错误 明确忽略类之间的映射更好,您可以确保已经正确映射了所有需要的属性。您可以使用AutoMapper: "Ignore the rest"? answer:

中创建的扩展程序
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Src, Dest>();
     cfg.IgnoreUnmapped<Src, Dest>();  // Ignores unmapped properties on specific map
});

方法cfg.IgnoreUnmapped忽略所有地图上的未映射属性,不推荐使用,因为它还隐藏了所有类的任何潜在问题。

答案 2 :(得分:0)

如果我有很多具有许多属性的类要忽略,那么我不想在调用AssertConfigurationIsValid()时出现异常,而是希望在日志中报告它,而只需检查所有有意丢失的未映射属性。 因为AutoMapper未公开进行验证的方法,所以我捕获了AssertConfigurationIsValid并以字符串形式返回错误消息。

    public string ValidateUnmappedConfiguration(IMapper mapper)
    {
        try
        {
            mapper.ConfigurationProvider.AssertConfigurationIsValid();
        }
        catch (AutoMapperConfigurationException e)
        {
              return e.Message;
        }
        return "";
    }

我正在从单元测试中调用ValidateUnmappedConfiguration方法

   [TestMethod]
    public void LogUmmappedConfiguration()
    {
        var mapper = new MapperConfiguration((cfg =>
        {
            cfg.AddProfile(new AutoMapperProfile());
        })).CreateMapper();
        var msg=ValidateUnmappedConfiguration(mapper) ;
        if (!msg.IsNullOrBlank())
        {
            TestContext.WriteString("Please review the list of unmapped fields and check that it is intentional: \n"+msg);
        }
    }