Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射正在失去参考_C#_.net_Automapper - Fatal编程技术网

C# 自动映射正在失去参考

C# 自动映射正在失去参考,c#,.net,automapper,C#,.net,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; } } publi

如何将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();
        }
    }
}
使用AutoMapper;
使用制度;
使用System.Collections.Generic;
命名空间控制台应用程序5
{
公营雇员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公营公司
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表雇员{get;set;}
}
公营国家
{
上市公司{get;set;}
公共列表雇员{get;set;}
}
公共类雇员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共类公司
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表雇员{get;set;}
}
公共类国家
{
上市公司{get;set;}
公共列表雇员{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
//映射器设置
Mapper.Initialize((cfg)=>
{
CreateMap();
CreateMap();
CreateMap();
});
//资料
var公司=新公司
{
Id=1,
Name=“Blah”,
雇员=新名单{
新员工{Id=1,Name=“John”},
新员工{Id=2,Name=“Mary”},
}
};
var国家=新国家{公司=新名单{公司};
country.Employees=公司.Employees;
//映射
var dto=Mapper.Map(国家);
//印刷品
dto.companys[0]。员工[0]。Id=100;
Console.WriteLine(“{0}-{1}”,dto.companys[0]。Employees[0]。Id,dto.Employees[0]。Id);//应相同
Console.WriteLine(dto.companys[0].Employees[0].Id==dto.Employees[0].Id);//应为true
控制台。写入线(“结束”);
Console.ReadLine();
}
}
}
基本上,我想更改我的第一个DTO列表中的一些属性,这些更改应该反映到同一个列表中,但在另一个属性中


ps:当我使用我的域实体时,它工作得很好

这不是automapper的问题,而是类的设计问题。 Automapper不知道
CountryDto.Employees
CountryDto.companys.Employees
应该是一样的,而且,阅读您的代码的开发人员也会知道这一点——因为类的设计方式。 Automapper只是为每个
列表创建一个新的
列表
集合在域实体中匹配的事实是因为您将一个集合引用设置为与另一个相等
country.Employees=公司.Employees
然而,它们在设计上并不相等,它们是两个不同的参考。它们是相等的,因为它们是如何初始化的

这个设计的目的是什么

如果要在一个国家/地区对象上列出所有公司的所有员工,则必须定义一个计算属性(或更好的方法),该属性将聚合来自国家/地区的字段,例如使用

然而,将计算属性放在DTO上并不是一个好的设计选择。
请详细描述您试图实现的目标,这样我可以建议更好的设计。

尝试使用ObservableCollection而不是List,然后您可以像var dto=Mapper.map(国家)那样进行映射;ObservableCollection可以帮助您反映您在第一个数据到第二个数据中所做的更改,因为这些是属性的副本。你需要做另一个投影才能看到DTO中的变化。很好的解释,太多了。我将尝试与我的团队一起回顾映射和概念。基本上,它的设计目的是将一些数据传输到另一个批处理项目,并返回处理后的数据。但我会尝试用另一种方式来处理这个“交叉”参考。。。。再来一次,tks。但是,如果您知道automapper中有一些配置来处理这种情况,那将很有趣:)