使用Automapper将实体映射到具有更多属性的实体时出错

时间:2014-08-11 14:19:52

标签: c# automapper

我正在尝试将一个实体映射到另一个具有相似属性的实体,但我希望在我的“目标类型”中有一个更多的字段。 我想映射一个实体,它使用目标值作为源类的空字段,我不希望所有字段映射到我的源类型。

看看这个例子:

[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

任何人都可以帮助我吗?

干杯。

1 个答案:

答案 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));