6

このデータベースを例にとってみましょう

従業員

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

給料

  • id-int(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は給与のリストを参照し、各給与は自分が所有する従業員を指します。これにより、循環参照の問題が発生します。

リポジトリパターンに従い、AutoMapperを使用して従業員をEmployeeDTOに転送し、給与を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 に答える