c# - 使用 Automapper 仅更新少数属性

标签 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 应该保留旧值。 显然我没有正确理解它。 谁能解释这个问题?并让我知道如何获得我期望的输出。

最佳答案

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

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

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

关于c# - 使用 Automapper 仅更新少数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334720/

相关文章:

c# - 在 asp.net 中使用 dropzone.js

c# - 模拟抽象保护方法

c# - MVC4 区域中的内容是否可以有相对路径?

c# - Asp.net mvc Url.Action 使用可为空参数重定向 Controller

c# - 如何将嵌套对象映射到现有的嵌套对象?

c# - 在使用SandcaSTLe的构建过程中自动生成html文档

c# - 字符串分数加倍

asp.net-mvc - 为什么在我的 ASP MVC4 应用程序中重定向资源捆绑?

c# - 用于双向映射的简单约定自动映射器(实体到/来自 ViewModel)

c# - AutoMapper 忽略子集合属性