【问题标题】:Error on mapping an entity on another with a property more using Automapper使用 Automapper 将一个实体映射到另一个具有更多属性的实体时出错
【发布时间】:2014-08-11 14:19:51
【问题描述】:

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

看一下例子:

[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.Map ignore all Null value properties from source object

谁能帮帮我?

干杯。

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    错误消息很奇怪——但它确实在这种特殊情况下IsSourceValueNull 不起作用。由于IsUser 是bool 类型,它的值永远不能是null

    这意味着当 AutoMapper 为该属性评估 IsSourceValueNull 时,每次对于 IsUser 属性它都会得到“假”。然后,它尝试映射IsUser 属性并失败。

    解决此问题的一种方法是明确忽略 IsUser 属性:

    Mapper.CreateMap<Person, DPerson>()
        .ForMember(dest => dest.IsUser, opt => opt.Ignore())         
        .ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
    

    【讨论】:

    • 我说这很奇怪,因为写在异常中的消息听起来像是 API 试图将我的类映射到布尔值,顺便说一句,这是因为我认为它很奇怪当我指定条件“.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));”时我假设我正在设置源类“IsSourceValueNull”和源类(Person)中的字段,所有字段都可以为空。我仍然认为它应该有效。无论如何,这是我使用 AutoMapper 的第一个项目,我只是假设。
    • 你可以这样做来检查类型吗?假设您试图获得双倍,但偶尔会获得字符串。你想跳过它或设置为 0.0
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2021-04-03
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多