Automapper正在失去参考

时间:2016-12-28 19:49:52

标签: c# .net 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列表中更改一些属性,并且更改应该反映到同一个列表,但是在另一个属性中。

ps:当我使用我的域名实体工作正常时!

1 个答案:

答案 0 :(得分:1)

这不是automapper的问题,而是类的设计。 Automapper并不知道CountryDto.EmployeesCountryDto.Companies.Employees是相同的,此外,阅读代码的开发人员也会知道 - 因为类的设计方式。 Automapper只为每个List<EmployeeDto>创建一个新的List<Employee> 集合在域实体中匹配的事实是因为您将一个集合引用设置为等于另一个集合引用 country.Employees = company.Employees; 但是,它们在设计上并不相同,它们是两个不同的参考。它们只是因为它们的初始化方式而相同。

这种设计的目的是什么?

如果您希望在国家/地区对象上列出所有公司的所有员工,则必须定义一个计算属性(或更好的方法),该属性将汇总来自国家/地区的字段,例如使用select many < / p>

但是,在DTO上放置计算属性不是一个好的设计选择。 请描述您想要实现的更多内容,以便我建议更好的设计。