我有很多实体,到目前为止,我一直在做类似的事情
Mapper.CreateMap<Employee, EmployeeDetailsDTO>()
.ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore());
我想告诉AutoMapper简单地忽略目标对象中缺少的属性,而不必指定它们中的每一个。到目前为止,我还没有找到一种方法可以使用我的多个SO和Google搜索。有人有解决方案吗?我已经准备好做某种循环或任何事情,只要它可以写一次,并且它将随着model / dto更改或添加的属性进行扩展。
你什么时候收到错误的?是在你打电话给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
您可能希望将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
的意图)
在wal's answer中建议“不要调用AssertConfigurationIsValid()”是不安全的,因为它会隐藏映射中的潜在错误。 最好明确忽略类之间的映射,您可以确保已经正确映射了所有需要的属性。您可以使用AutoMapper: "Ignore the rest"?中创建的扩展名来回答:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Src, Dest>();
cfg.IgnoreUnmapped<Src, Dest>(); // Ignores unmapped properties on specific map
});
方法cfg.IgnoreUnmapped忽略所有地图上的未映射属性,不推荐使用,因为它还隐藏了所有类的任何潜在问题。
如果我有许多要忽略的属性的类,我不希望在调用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);
}
}