我正在尝试将一个实体映射到另一个具有相似属性的实体,但我希望在我的“目标类型”中有一个更多的字段。 我想映射一个实体,它使用目标值作为源类的空字段,我不希望所有字段映射到我的源类型。
看看这个例子:
[TestClass]
public class Example
{
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Foo { get; set; }
}
public class DPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Foo { get; set; }
public bool IsUser { get; set; }
}
[TestMethod]
public void TestNullIgnore()
{
Mapper.CreateMap<Person, DPerson>()
.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
var sourcePerson = new Person
{
FirstName = "Bill",
LastName = "Gates",
};
var destinationPerson = new DPerson
{
FirstName = "",
LastName = "",
Foo = 1,
IsUser = true
};
Mapper.Map(sourcePerson, destinationPerson);
Assert.IsNotNull(destinationPerson);
Assert.AreEqual(1, destinationPerson.Foo);
Assert.AreEqual(true, destinationPerson.IsUser);
}
}
当我在DPerson类中添加IsUser属性时,AutoMapper会抛出一个奇怪的异常“AutoMapper.AutoMapperMappingException”,并在其消息中说它无法映射“Person - &gt; Boolean”。
如果我删除“.ForAllMembers(opt =&gt; opt.Condition(srs =&gt;!srs.IsSourceValueNull))”配置它可以工作,但我在Foo属性上获得了“null”。
我在这个问题的第一个答案的代码中提到:AutoMapper.Map ignore all Null value properties from source object
任何人都可以帮助我吗?
干杯。
答案 0 :(得分:0)
错误消息很奇怪 - 但确实有意义IsSourceValueNull
在这种特定情况下不起作用。由于IsUser
的类型为bool,因此其值不能为null
。
这意味着当AutoMapper评估该属性的IsSourceValueNull
时,它会得到&#34; false&#34;每次都为IsUser
财产。然后,它尝试映射IsUser
属性并失败。
解决此问题的一种方法是明确忽略IsUser
属性:
Mapper.CreateMap<Person, DPerson>()
.ForMember(dest => dest.IsUser, opt => opt.Ignore())
.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));