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

Plu*_*luc 14 c# automapper

我有很多实体,到目前为止,我一直在做类似的事情

Mapper.CreateMap<Employee, EmployeeDetailsDTO>()
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

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

wal*_*wal 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
Run Code Online (Sandbox Code Playgroud)

您可能需要调用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>();
Run Code Online (Sandbox Code Playgroud)

然后,如果您决定要检查映射的有效性(在您的情况下逐个案例),然后调用

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName);
Run Code Online (Sandbox Code Playgroud)

在你的情况下很重要和/或你打电话给AssertConfigurationIsValid你的任何情况都应该使用像AutoFixture和单元测试这样的东西来确保你的映射工作正常.(这是意图AssertConfigurationIsValid)


MiF*_*vil 6

wal的回答中建议"不要调用AssertConfigurationIsValid()"是不安全的,因为它会隐藏映射中的潜在错误.
最好明确忽略类之间的映射,您可以确保已经正确映射了所有需要的属性.您可以使用在AutoMapper中创建的扩展程序:"忽略其余部分"?回答:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Src, Dest>();
     cfg.IgnoreUnmapped<Src, Dest>();  // Ignores unmapped properties on specific map
});
Run Code Online (Sandbox Code Playgroud)

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