gpt4 book ai didi

c# - Automapper 正在丢失引用

转载 作者:行者123 更新时间:2023-11-30 12:22:17 28 4
gpt4 key购买 nike

如何设置 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 列表中的一些属性,这些更改应该反射(reflect)在同一个列表中,但在另一个属性中。

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

最佳答案

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

这样设计的目的是什么?

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

但是,将计算属性放在 DTO 上并不是一个好的设计选择。请详细描述您要实现的目标,以便我提出更好的设计建议。

关于c# - Automapper 正在丢失引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41368773/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com