AutoMapper实体集合部分更新无法按预期工作

时间:2017-06-18 16:28:30

标签: c# entity-framework automapper

基本上我正在尝试通过更改数据库中已存在的实体对象来更新它,以匹配用户提供的输入对象的值。然而,实体对象具有比输入对象更多的属性(让我们称之为'额外属性')并且我希望这些“额外属性”保留在它们在地图之后具有的任何值,并且只有两个对象中存在的属性都是重写的。

我的问题是,当我将单个输入值映射到实体时,我可以执行上面描述的操作,但是,当实体输出的输入值列表比实体的“额外属性”设置为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使用现有对象而不是创建新对象(或者至少如果它创建新对象,则填充原始对象中不属于该对象的值)映射)?

0 个答案:

没有答案