gpt4 book ai didi

asp.net-mvc - 映射时如何处理循环引用?

转载 作者:行者123 更新时间:2023-12-04 20:48:56 25 4
gpt4 key购买 nike

以这个数据库为例

员工

  • id - int (PK)
  • 名称 - varchar

  • 薪资
  • id - int (PK)
  • 员工 ID - int (FK)
  • 金额 - float

  • Entity Framework 将生成类似于这些的模型:
    public partial class Employee
    {
    public Employee()
    {
    this.Salaries = new HashSet<Salary>();
    }
    public int id { get; set; }
    public string name { get; set; }
    }

    public partial class Salary
    {
    public int id { get; set; }
    public int employee_id { get; set; }
    public float amount { get; set; }
    public Employee employee { get; set; }
    }

    Emplyee 引用他的薪水列表,而每个薪水都指向他拥有的员工。这会导致循环引用问题。

    我遵循存储库模式并使用 AutoMapper 将 Employee 转移到 EmployeeDTO,将 Salary 转移到 SalaryDTO。我希望那些 DTO 保留有关 child 关系的信息。但是,我不想递归地执行此操作。我可以做类似的事情。
    public partial class EmployeeDTO
    {
    public EmployeeDTO()
    {
    this.Salaries = new HashSet<SalaryChildDTO>();
    }
    public int id { get; set; }
    public string name { get; set; }
    }

    public partial class SalaryChildDTO
    {
    public int id { get; set; }
    public float amount { get; set; }
    }

    但这将成为维护噩梦。

    我如何告诉 AutoMapper 只映射一个后代,或实现类似的目标?

    最佳答案

    我最终选择了 DTO - ChildDTO 路线,因为我找到了一种易于管理的方法。

    public partial class EmployeeDTO
    {
    public int id { get; set; }
    public string name { get; set; }
    public virtual IEnumerable<SalaryChildDTO> Salaries { get; set; } //Notice the Virtual
    }

    public partial class EmployeeChildDTO : EmployeeDTO
    {
    [IgnoreMap] //MAGIC!
    public override IEnumerable<SalaryChildDTO> Salaries { get; set; } //Override! :o
    }

    public partial class SalaryDTO
    {
    public int id { get; set; }
    public int employe_id { get; set; }
    public float amount { get; set; }
    public virtual EmployeeChildDTO Employee { get; set; } //Notice the Virtual once again
    }

    public partial class SalaryChildDTO : SalaryDTO
    {
    [IgnoreMap] //MAGIC!
    public override EmployeeChildDTO Employee { get; set; } //Override! :o
    }

    这样,唯一影响子 DTO 的数据库更改就是 FK!

    我可以用另一种方式来完成(EmployeeDTO 扩展 EmployeeChildDTO)并避免 Overrides、Virtuals 和 IgnoreMaps,但我想保留核心 DTO 作为基类。

    关于asp.net-mvc - 映射时如何处理循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12941180/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com