基本上我正在尝试通过更改数据库中已存在的实体对象来更新它,以匹配用户提供的输入对象的值。然而,实体对象具有比输入对象更多的属性(让我们称之为'额外属性')并且我希望这些“额外属性”保留在它们在地图之后具有的任何值,并且只有两个对象中存在的属性都是重写的。
我的问题是,当我将单个输入值映射到实体时,我可以执行上面描述的操作,但是,当实体输出的输入值列表比实体的“额外属性”设置为0或null。
我认为发生这种情况的原因是因为AutoMapper在尝试映射值列表时创建了全新的对象,并忽略了目标对象上没有来自源对象的相应值的值,这使得它们具有默认值
我编写了一个简单的控制台应用程序,在ExampleB中重现了这个问题(我使用的是AutoMapper的6.1.0版本,这是编写本文时的最新版本):
namespace TestEF
{
using System;
using AutoMapper;
class Program
{
public class Input
{
public long One { get; set; }
}
public class Entity
{
public long One { get; set; }
public long Two { get; set; }
}
static void CreateMaps()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Input, Entity>();
});
}
static void ExampleA()
{
var input = new Input
{
One = 1
};
var entity = new Entity
{
One = -1,
Two = 2
};
var res = Mapper.Map(input, entity);
Console.WriteLine($"Example A: {res.One}: {res.Two}, Same object: {res == entity}");
}
static void ExampleB()
{
var inputList = new Input[]
{
new Input
{
One = 1
}
};
var entityList = new Entity[]
{
new Entity
{
One = -1,
Two = 2
}
};
var res = Mapper.Map(inputList, entityList);
Console.WriteLine($"Example B: {res[0].One}: {res[0].Two}. Same object: {res == entityList}. Same list item: {res[0] == entityList[0]}");
}
static void Main(string[] args)
{
CreateMaps();
ExampleA(); // This one works as expected
ExampleB(); // This is where the problem is
Console.Read(); // Stop the console from closing
}
}
}
任何想法如何解决这个问题,以便在映射列表项时,AutoMapper使用现有对象而不是创建新对象(或者至少如果它创建新对象,则填充原始对象中不属于该对象的值)映射)?