在3层体系结构中自动映射多对多映射

时间:2016-09-26 14:24:14

标签: c# asp.net asp.net-mvc entity-framework automapper

我在DataAccessLayer上有两个实体模型:

消费

 public class Consumer 
 {
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public virtual ICollection<Contractor> Contractors { get; set; }

    public Consumer()
    {
        Contractors = new List<Contractor>();
    }
 }

承包商

public class Contractor 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }

    public virtual ICollection<Consumer> Consumers { get; set; }

    public Contractor()
    {
        Consumers = new List<Consumer>();
    }
}

...和传输数据层上的两个类:

ConsumerTransfer

 public class ConsumerTransfer
 {
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
    public IList<ContractorTransfer> ContractorTransfer { get; set; } 
 }

ContractorTransfer

 public class ContractorTransfer
 {
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }
 }

**

如何从Consumer到ConsumerTransfer获取数据?

**

我试着这样做

 public IEnumerable<ConsumerTransfer> GetСonsumers()
    {
        Mapper.Initialize(cfg => cfg.CreateMap<Consumer, ConsumerTransfer>()
            .ForMember(dto=>dto.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dto => dto.Name, opt => opt.MapFrom(src => src.Name))
            .ForMember(dto => dto.PhoneNumber, opt => opt.MapFrom(src => src.PhoneNumber))
            .ForMember(dto => dto.ContractorTransfer, opt => opt.MapFrom(src => src.Contractors))
            );
        return Mapper.Map<IEnumerable<Consumer>, IEnumerable<ConsumerTransfer>>(Database.Consumers.GetAll()); 
    }

2 个答案:

答案 0 :(得分:1)

首先,我要重命名你的&#34; ContractorTransfer&#34;财产到&#34;承包商&#34;。通常,我在DTO和源类型之间保持相同的属性名称。不是100%规则,但除非我在客户端有一个非常好的理由(序列化问题,无论如何),否则我不会更改属性名称。

其次,您的AutoMapper配置位置错误。您需要将Initialize放在应用程序的启动中,而不是放在映射旁边。

第三,您的配置过于冗长。 AutoMapper自动映射具有相同名称的属性。

第四,您错过了第二组源/目标类型的地图。假设您修复了不一致的属性名称,请在此处输入您的配置:

Mapper.Initialize(cfg => {
    cfg.CreateMap<Consumer, ConsumerTransfer>();
    cfg.CreateMap<Contract, ContractTransfer>();
});

然后在执行地图时:

Mapper.Map<Consumer, ConsumerTransfer>(consumer);

那就是它。

答案 1 :(得分:0)

public IEnumerable<ConsumerTransfer> GetСonsumers()
{
    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<Consumer, ConsumerTransfer>()
            .ForMember(dto => dto.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dto => dto.Name, opt => opt.MapFrom(src => src.Name))
            .ForMember(dto => dto.PhoneNumber, opt => opt.MapFrom(src => src.PhoneNumber))
            .ForMember(dto => dto.ContractorTransfer, opt => opt.MapFrom(src => src.Contractors));

        cfg.CreateMap<Contractor, ContractorTransfer>();
    });

    return Mapper.Map<IEnumerable<ConsumerTransfer>>(Database.Consumers.GetAll());
}