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。 但是,如果你知道自动映射器中的某些配置来处理这种情况,它将是有趣的:) –
相关问题