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:當我使用我的域名實體工作的很好!
嘗試使用ObservableCollection
ObservableCollection可能會幫助您將您在第一個dto中所做的更改反映到第二個dto – Sanket
因爲這些是屬性的副本。您需要做另一個投影來查看DTO中的更改。 – Jasen
回答
這不是automapper的問題,而是你的類的設計。 Automapper不知道
CountryDto.Employees
和CountryDto.Companies.Employees
的意思是相同的,此外,讀取代碼的開發人員也會知道 - 因爲類的設計方式。 Automapper只是創建爲每個List<Employee>
事實上新List<EmployeeDto>
在域實體集合比賽是因爲你設置一個集合引用等於其他country.Employees = company.Employees;
然而,它們不是由設計等,它們是兩個不同的引用。他們只是平等的,因爲他們是如何初始化的。這種設計的目的是什麼?
如果你想列出所有公司的所有員工一個國家對象上 - 你有(,方法或更好),將聚集來自各國的領域,例如使用定義計算特性select many
但是,將計算屬性放在DTO上並不是一個好的設計選擇。 請描述更多你想要達到的目標,所以我可以提出更好的設計。
來源
2016-12-28 20:09:10 ironstone13
很好的解釋,太多了。我會盡力與我的團隊一起審查地圖和概念。基本上它被設計爲將一些數據傳輸到另一批處理項目,並取回處理的數據。 但我會盡力處理這個「交叉」引用我另一種方式....再一次,tks。 但是,如果你知道自動映射器中的某些配置來處理這種情況,它將是有趣的:) –
相關問題