2016-12-28 82 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。 但是,如果你知道自動映射器中的某些配置來處理這種情況,它將是有趣的:) –