使用Automapper仅更新少数属性

时间:2016-05-19 21:57:15

标签: c# asp.net-mvc-4 automapper

我最近开始使用Automapper。我有50个属性的大数据库表。 我想使用Automapper更新表,但只有少数选定的属性将使用viewmodel传递。

为了使我的问题变得简单,我写了一个小型控制台程序。

internal class Person
{
    public string FirstName { get; set; }
    public string NickName { get; set; }
    public string LastName { get; set; }
}

internal class PersonContract
{
    public string FirstName { get; set; }
    public string NickName { get; set; }
    public string LastName { get; set; }
}
class Program
{
    static void Main(string[] args)
    {

        PersonContract Person1 = new PersonContract { NickName = "Dan", LastName = "Smith"  };
        Person Person2 = new Person { FirstName = "Robert", NickName = "Rob" };

        Mapper.CreateMap<PersonContract, Person>();


        Mapper.Map(Person1, Person2);

        Console.WriteLine(Person2.FirstName);
        Console.WriteLine(Person2.NickName);
        Console.WriteLine(Person2.LastName);

        Console.ReadLine();
    }
}

我的输出是 空值 担 史密斯

我在期待 罗伯特 担 史密斯

因为如果Person1没有传递“Firstname”,那么Person2应该保留旧值。 显然我没有理解它。 有谁能解释这个问题?让我知道如何获得我期待的输出。

2 个答案:

答案 0 :(得分:3)

默认情况下, Automapper 将复制所有属性,无论它们是否为空,但您可以使用ForAllMembersCondition方法设置所有成员满足的条件。

在您的情况下,您可以检查IsSourceValueNull属性:

Mapper.CreateMap<PersonContract, Person>()
      .ForAllMembers(cfg => cfg.Condition(rc => !rc.IsSourceValueNull));

答案 1 :(得分:0)

你的输出是正确的,源的名字值为null,automapper只为你复制值。如果你想按照你的提议退出,我建议你写一个自定义类型转换器,请参阅 - http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters了解概述。