2016-12-28 81 views
3

如何将automapper设置为下一个方案可正常工作?Automapper丢失参考

using AutoMapper; 
using System; 
using System.Collections.Generic; 

namespace ConsoleApplication5 
{ 
    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class Company 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<Employee> Employees { get; set; } 
    } 

    public class Country 
    { 
     public List<Company> Companies { get; set; } 
     public List<Employee> Employees { get; set; } 
    } 

    public class EmployeeDto 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class CompanyDto 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<EmployeeDto> Employees { get; set; } 
    } 

    public class CountryDto 
    { 
     public List<CompanyDto> Companies { get; set; } 
     public List<EmployeeDto> Employees { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // mapper set up 
      Mapper.Initialize((cfg) => 
      { 
       cfg.CreateMap<Country, CountryDto>(); 
       cfg.CreateMap<Company, CompanyDto>(); 
       cfg.CreateMap<Employee, EmployeeDto>(); 
      }); 

      // data 
      var company = new Company 
      { 
       Id = 1, 
       Name = "Blah", 
       Employees = new List<Employee> { 
        new Employee { Id = 1, Name = "John" }, 
        new Employee { Id = 2, Name = "Mary" }, 
       } 
      }; 

      var country = new Country { Companies = new List<Company> { company } }; 
      country.Employees = company.Employees; 

      // mapping 
      var dto = Mapper.Map<CountryDto>(country); 

      //print 
      dto.Companies[0].Employees[0].Id = 100; 
      Console.WriteLine("{0} - {1}", dto.Companies[0].Employees[0].Id, dto.Employees[0].Id); // should be the same 
      Console.WriteLine(dto.Companies[0].Employees[0].Id == dto.Employees[0].Id); // should be true 

      Console.WriteLine("End"); 
      Console.ReadLine(); 
     } 
    } 
} 

基本上我想改变我的第一DTO列表中的某些属性和变化应该反映到同一个列表,但在另一个porperty。

ps:当我使用我的域名实体工作的很好!

+1

尝试使用ObservableCollection

而不是列表
,然后可以像var dto = Mapper.Map >(country); – Sanket

+1

ObservableCollection可能会帮助您将您在第一个dto中所做的更改反映到第二个dto – Sanket

+0

因为这些是属性的副本。您需要做另一个投影来查看DTO中的更改。 – Jasen

回答

1

这不是automapper的问题,而是你的类的设计。 Automapper不知道CountryDto.EmployeesCountryDto.Companies.Employees的意思是相同的,此外,读取代码的开发人员也会知道 - 因为类的设计方式。 Automapper只是创建为每个List<Employee> 事实上新List<EmployeeDto>在域实体集合比赛是因为你设置一个集合引用等于其他 country.Employees = company.Employees; 然而,它们不是由设计等,它们是两个不同的引用。他们只是平等的,因为他们是如何初始化的。

这种设计的目的是什么?

如果你想列出所有公司的所有员工一个国家对象上 - 你有(,方法或更好),将聚集来自各国的领域,例如使用定义计算特性select many

但是,将计算属性放在DTO上并不是一个好的设计选择。 请描述更多你想要达到的目标,所以我可以提出更好的设计。

+1

很好的解释,太多了。我会尽力与我的团队一起审查地图和概念。基本上它被设计为将一些数据传输到另一批处理项目,并取回处理的数据。 但我会尽力处理这个“交叉”引用我另一种方式....再一次,tks。 但是,如果你知道自动映射器中的某些配置来处理这种情况,它将是有趣的:) –