使用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。映射忽略源对象的所有空值属性

有人能帮我吗?

欢呼。

使用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));