使用Automapper将一个实体映射到另一个具有属性的实体时出错
本文关键字:实体 另一个 属性 出错 映射 使用 一个 Automapper | 更新日期: 2023-09-27 18:17:41
我正试图在另一个具有类似属性的实体中映射一个实体,但我想在我的"目的地类型"中有更多的字段。我想映射一个实体,它使用源类的空字段的目的值,我不想让所有字段映射到我的源类型。
请看下面的例子:
[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 -> Boolean"。
如果我删除"。ForAllMembers(opt => opt. condition (srs => !srs. issourcevaluenull))"配置它可以工作,但我在Foo属性处得到"null"。
我采用了这个问题的第一个答案的代码:AutoMapper。映射忽略源对象的所有空值属性
有人能帮我吗?
欢呼。
这个错误消息是奇怪的——但是在这个特殊情况下IsSourceValueNull
不能工作是有意义的。因为IsUser
是bool类型,所以它的值永远不可能是null
。
这意味着当AutoMapper为该属性评估IsSourceValueNull
时,每次对于IsUser
属性都得到"false"。然后,它尝试映射IsUser
属性并失败。
IsUser
属性:
Mapper.CreateMap<Person, DPerson>()
.ForMember(dest => dest.IsUser, opt => opt.Ignore())
.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));