如何使用 AutoMapper 使用 EntityFramework 更新带有嵌套列表的对象?

How to use AutoMapper for updating Object with nested List using EntityFramework?

我想使用 AutoMapper 将带有嵌套列表的 EntityDto 映射到实体,然后使用 SaveChanges() 调用更新它。

问题是 AutoMapper 将嵌套的 List 元素映射为新对象,因此 EntityFramework 认为我想添加具有现有 ID 的新对象。

示例:

    public class Entity
    {
        public Guid Id { get; set; }
        public List<NestedEntity> NestedEntityList { get; set; }
    }

    public class EntityDto
    {
        public Guid Id { get; set; }
        public List<NestedEntityDto> NestedEntityList { get; set; }
    }

    public class NestedEntity
    {
        public Guid Id { get; set; }
        public string PropertyOne { get; set; }
        public string PropertyTwo { get; set; }
    }

    public class NestedEntityDto
    {
        public Guid Id { get; set; }
        public string PropertyTwo { get; set; }
    }

实体有一个包含 2 个 NestedEntity 对象的列表

{
    "Id": "EntityId"
    "NestedEntityList": [
        {
            "Id": "A",
            "PropertyOne": "Value A",
            "PropertyTwo": "Value AA"
        },
        {
            "Id": "B",
            "PropertyOne": "Value B",
            "PropertyTwo": "Value BB"
        }
    ]
}

更新:(A修改,B删除,C添加)

EntityDto 有一个包含 2 个 NestedEntity 对象的列表

{
    "Id": "EntityId"
    "NestedEntityList": [
        {
            "Id": "A",
            "PropertyTwo": "Value AAA (Updated)"
        },
        {
            "Id": "C",
            "PropertyTwo": "Value CC"
        }
    ]
}

无需进一步配置,AutoMapper 通过创建新对象来映射 NestedEntityList。这会导致 2 个问题:

  1. EntityFramework 会将这些新对象作为新创建的对象而不是已更新的现有对象进行跟踪。这会导致以下错误消息:“无法跟踪实体类型“NestedEntity”的实例,因为已跟踪具有键值“A”的另一个实例。
  2. 如果NestedEntity 有PropertyOne 值,那么映射后为null,因为NestedEntityDto 没有PropertyOne。我想更新 EntityDto 中的属性(即 PropertyTwo)并保留其他所有内容的值。

所以我想达到的结果:(A修改,B删除,C添加)

{
    "Id": "EntityId"
    "NestedEntityList": [
        {
            "Id": "A",
            "PropertyOne": "Value A", //Old value, not updated with NULL
            "PropertyTwo": "Value AAA (Updated)" //Updated value
        },
        {
            "Id": "C", //New item added in the update
            "PropertyOne": NULL,
            "PropertyTwo": "Value CC"
        }
    ]
}

我需要如何配置 AutoMapper 才能实现此目的?有可能吗?

映射到现有集合时,首先清除目标集合。如果这不是您想要的,请查看 AutoMapper.Collection