使用 Automapper 仅更新少数属性
Updating only few properties using Automapper
我最近开始使用 Automapper。我有包含 50 个属性的大数据库 table。
我想使用 Automapper 更新 table,但只有少数选定的属性将使用 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 将复制所有属性,无论它们是否为 null,但您可以使用 ForAllMembers
和 [= 设置所有成员都满足的条件12=] 方法。
在您的情况下,您可以检查 IsSourceValueNull
属性:
Mapper.CreateMap<PersonContract, Person>()
.ForAllMembers(cfg => cfg.Condition(rc => !rc.IsSourceValueNull));
你的输出是正确的,你的来源的名字值是空的,自动映射器只是为你复制值。如果你想像你提到的那样出去,我建议你写一个自定义类型转换器,请参阅 - http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters 了解概述。
我最近开始使用 Automapper。我有包含 50 个属性的大数据库 table。 我想使用 Automapper 更新 table,但只有少数选定的属性将使用 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 将复制所有属性,无论它们是否为 null,但您可以使用 ForAllMembers
和 [= 设置所有成员都满足的条件12=] 方法。
在您的情况下,您可以检查 IsSourceValueNull
属性:
Mapper.CreateMap<PersonContract, Person>()
.ForAllMembers(cfg => cfg.Condition(rc => !rc.IsSourceValueNull));
你的输出是正确的,你的来源的名字值是空的,自动映射器只是为你复制值。如果你想像你提到的那样出去,我建议你写一个自定义类型转换器,请参阅 - http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters 了解概述。