C# 自动映射实体集合部分更新未按预期工作

C# 自动映射实体集合部分更新未按预期工作,c#,entity-framework,automapper,C#,Entity Framework,Automapper,基本上,我试图对数据库中已经存在的实体对象进行更新,方法是更改其值以匹配用户提供的输入对象的值。但是,实体对象的属性比输入对象多(我们称之为“额外属性”),我希望这些“额外属性”保留在映射后的值中,并且只覆盖两个对象中存在的属性 我的问题是,当我将单个输入值映射到实体时,我可以执行上面描述的操作,但是,当输入值列表映射到实体的输出时,实体的“额外属性”设置为0或null 我认为发生这种情况的原因是,AutoMapper在尝试映射值列表时创建了全新的对象,并忽略了目标对象上的值,这些值没有源对象中

基本上,我试图对数据库中已经存在的实体对象进行更新,方法是更改其值以匹配用户提供的输入对象的值。但是,实体对象的属性比输入对象多(我们称之为“额外属性”),我希望这些“额外属性”保留在映射后的值中,并且只覆盖两个对象中存在的属性

我的问题是,当我将单个输入值映射到实体时,我可以执行上面描述的操作,但是,当输入值列表映射到实体的输出时,实体的“额外属性”设置为0或null

我认为发生这种情况的原因是,AutoMapper在尝试映射值列表时创建了全新的对象,并忽略了目标对象上的值,这些值没有源对象中的相应值,因此它们具有默认值

我已经编写了一个简单的控制台应用程序,在示例B中重现了这个问题(我正在使用AutoMapper的6.1.0版本,这是撰写本文时的最新版本):

namespace TestEF
{
使用制度;
使用自动制版机;
班级计划
{
公共类输入
{
公共长一{get;set;}
}
公共类实体
{
公共长一{get;set;}
公共长二{get;set;}
}
静态void CreateMaps()
{
Mapper.Initialize(cfg=>
{
CreateMap();
});
}
静态void示例a()
{
变量输入=新输入
{
一=1
};
var实体=新实体
{
一=-1,
二=2
};
var res=Mapper.Map(输入,实体);
WriteLine($“示例A:{res.One}:{res.Two},同一对象:{res==entity}”);
}
静态无效示例B()
{
变量输入列表=新输入[]
{
新输入
{
一=1
} 
};
var entityList=新实体[]
{
新实体
{
一=-1,
二=2
}
};
var res=Mapper.Map(inputList,entityList);
Console.WriteLine($”示例B:{res[0]。一个}:{res[0]。两个}。同一对象:{res==entityList}。同一列表项:{res[0]==entityList[0]}”);
}
静态void Main(字符串[]参数)
{
CreateMaps();
ExampleA();//这一个按预期工作
ExampleB();//这就是问题所在
Console.Read();//停止关闭控制台
}
}
}
是否知道如何解决此问题,以便在映射列表项时,AutoMapper使用现有对象而不是创建新对象(或者至少如果它创建了新对象,则填充不属于映射的原始对象的值)

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
        }
    }
}