【问题标题】:Automapper nests parent entity inside child entityAutomapper 将父实体嵌套在子实体中
【发布时间】:2018-03-02 11:51:45
【问题描述】:

在映射相互引用的嵌套类时遇到问题。实体框架在循环中流行嵌套实体,因此我最终在映射后将父实体嵌套在嵌套子实体中。

我制作了一个示例程序,您可以复制粘贴来显示问题。在我的实际程序中,我正在映射集合,因此需要循环整个集合以将所有嵌套对象设置为 null,这感觉不太好,如果可能的话,我宁愿调整我的映射规则。

这是显示问题的代码:

using AutoMapper;

public class Job
{
    public string Name { get; set; }
    public PayPackage PayPackage { get; set; }
}

public class PayPackage
{
    public string Name { get; set; }
    public Job Job { get; set; }
}

public class JobViewModel
{
    public string Name { get; set; }
    public PayPackageViewModel PayPackage { get; set; }
}

public class PayPackageViewModel
{
    public string Name { get; set; }
    public JobViewModel Job { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var job = new Job
        {
            Name = "Job Name",
            PayPackage = new PayPackage
            {
                Name = "Pay Package Name"
            }
        };

        job.PayPackage.Job = job; //simulate how EF is populating entity

        var config = new MapperConfiguration(c =>
        {
            c.CreateMap<Job, JobViewModel>();
            c.CreateMap<JobViewModel, Job>();
            c.CreateMap<PayPackage, PayPackageViewModel>();
            c.CreateMap<PayPackageViewModel, PayPackage>();
        });

        var mapper = config.CreateMapper();

        var jobVm = mapper.Map<JobViewModel>(job);

        Assert.IsTrue(jobVm.PayPackage != null);
        Assert.IsTrue(jobVm.PayPackage.Job == null); //how do I specify mapping so this passes?

    }
}

避免父级在映射结果中出现两次的最佳方法是什么?

【问题讨论】:

  • 出于好奇 - 为什么要这样做?例如。序列化时是否要防止递归异常?
  • 所以我不会为每条记录返回两次工作
  • 虽然这两个实例都是对同一个对象的引用。这会导致您的应用出现什么现实问题?
  • 在我的应用程序中,我有支付包的返回集合的端点,并且嵌套的工作详细信息使支付包再次嵌套。所以我两次返回相同的数据。它可以忽略,但我宁愿不要两次返回相同的数据
  • 尝试最大深度。见stackoverflow.com/questions/48824263/…

标签: c# automapper


【解决方案1】:

例如

c.CreateMap<Job, JobViewModel>()
 .ForMember(dest => dest.PayPackage, opt => opt.Ignore());

当映射发生时,目标JobViewModel 对象的PayPackage 属性将被忽略。

【讨论】:

  • 我想要工资包里面的工作。我只是不希望Job.PayPackage.Job 递归,因为那样我会返回工作两次
  • 我提供的只是一个例子。如果您想在映射到PayPackageViewModel 时忽略Job 属性,请进行适当的调整。您是在说PayPackageViewModel 有时是JobViewModel 的孩子,有时不是,您是否希望映射能够区分?如果是这样,那么我认为您不走运,因为您无法创建使用源对象和目标对象以外的任何对象的条件。
  • 一个可能的选项可能是添加对AfterMap 的调用并检查是否有一个子对象的子对象与当前目标对象相同,如果是,则设置该孙子属性到null。不过,它可能不会好转,因为您可能已经在映射中遇到了无限循环。
猜你喜欢
  • 2010-12-06
  • 2016-10-25
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多