【问题标题】:How to fix when mapping DTO to Entity AutoMapper creates circular dependency将 DTO 映射到 Entity AutoMapper 创建循环依赖时如何修复
【发布时间】:2019-12-21 23:39:29
【问题描述】:

我有一个数据库层次结构,例如:工作表和设备之间是一对一的关系。当我尝试将 WorksheetDto 映射到 Worksheet 时,AutoMapper 通过 Worksheet 和 Device 进行循环依赖。

我在解决方案之后进行了很多搜索,我发现我必须忽略设备的工作表参考。 (我的意思是 Device.Worksheet)

实体和 DTO:

public class Worksheet : EntityBase
    {
        public virtual Device Device { get; set; }
    }

public class WorksheetDto : EntityBaseDto
    {
        public virtual DeviceDto Device { get; set; }
    }

public class Device : EntityBase
    {
        public virtual Worksheet Worksheet { get; set; }
    }

public class DeviceDto : EntityBaseDto
    {
        public virtual WorksheetDto Worksheet { get; set; }
    }

AutoMapper 配置:

var config = new MapperConfiguration(cfg =>
            {

                cfg.CreateMap<Device, DeviceDto>();
                    .ForMember(w => w.Worksheet, map => map.Ignore())
                    .PreserveReferences()
                    .ReverseMap();
            });

当我这样使用它时,什么也没有发生并得到以下错误:

System.InvalidOperationException: 'Multiplicity constraint violated. The role 'Worksheet_Device_Target' of the relationship 'RMDApp.DataLayer.Worksheet_Device' has multiplicity 1 or 0..1.'

所以总结就是我在调试的时候毕竟可以看到循环依赖。因此 EF 无法上传 Worksheet,因为它提供了错误。

【问题讨论】:

  • 对于 AM 部分,不再需要 PreserveReferences。您可以更新到最新版本以防万一。

标签: c# entity-framework mapping automapper


【解决方案1】:

工作表和设备是一一对应的,但是在获取工作表时选择是否加载设备,反之亦然。

只在一个地方保持虚拟,它不会尝试加载,也不会创建循环依赖

【讨论】:

  • 我已经从 Device 和 DeviceDTO 中删除了 virtual 关键字,但 AM 仍然会导致循环依赖...
  • 为什么在这两个地方都需要参考,只保留在一个地方,将设备保留在工作表中并从设备中删除工作表
猜你喜欢
  • 2021-01-08
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
相关资源
最近更新 更多