6

以这个数据库为例

员工

  • id - 整数 (PK)
  • 名称 - varchar

薪水

  • id - 整数 (PK)
  • employee_id - int (FK)
  • 金额 - 浮动

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 引用他的 Salary 列表,而每个 Salary 都指向他拥有的员工。这会导致循环引用问题。

我遵循存储库模式并使用 AutoMapper 将 Employee 转移到 EmployeeDTO 并将 Salary 转移到 SalaryDTO。我希望那些 DTO 保留其子关系的信息。但是,我不想递归地这样做。我可以做类似的事情。

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 只映射一个后代,或实现类似的目标?

4

2 回答 2

3

我最终选择了 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 保留为基类。

于 2012-10-18T13:21:01.020 回答
0

我不明白为什么这将是维护的噩梦。我一直在做同样的事情有一段时间了,它对我来说工作得很好。不过要注意的一件事是,您仍然希望在SalaryChildDTO班级中使用员工 ID。

于 2012-10-17T19:22:04.547 回答