C# 自动映射多对多映射

C# 自动映射多对多映射,c#,.net,entity-framework,automapper,C#,.net,Entity Framework,Automapper,帕特里克,谢谢你对正确问题的建议 编辑1: 我有三张多对多关系的桌子。这样地: 良好实体: public partial class GoodEntity { public GoodEntity() { this.GoodsAndProviders = new HashSet<GoodAndProviderEntity>(); } public int id { get; set; } public string name

帕特里克,谢谢你对正确问题的建议

编辑1:

我有三张多对多关系的桌子。这样地:

良好实体:

public partial class GoodEntity
{
    public GoodEntity()
    {
        this.GoodsAndProviders = new HashSet<GoodAndProviderEntity>();
    }

    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public decimal cost { get; set; }
    public Nullable<decimal> price { get; set; }

    public virtual ICollection<GoodAndProviderEntity> GoodsAndProviders { get; set; }
}
古德托:

public class GoodDTO
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public decimal cost { get; set; }
    public decimal? price { get; set; }

    public IList<ProviderDTO> providers { get; set; }
}
这是创建地图的代码:

Mapper.CreateMap<ProviderDTO, ProviderEntity>();
Mapper.CreateMap<ProviderEntity, ProviderDTO>();

Mapper.CreateMap<GoodEntity, GoodDTO>()
      .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders));
Mapper.CreateMap<GoodAndProviderEntity, ProviderDTO>();
Mapper.CreateMap();
CreateMap();
Mapper.CreateMap()
.ForMember(dto=>dto.providers,opt=>opt.MapFrom(x=>x.GoodsAndProviders));
CreateMap();
而且它有一半的效果。Automapper被完全映射为“货物”,并被创建为该货物的所有供应商的列表。但是automapper不会填充提供者。

如果我使用Mapper.AssertConfigurationsValid(),则:

找到了未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型=================================================================================================================================================================================================ProviderDTO->ProviderEntity(目标成员列表)Core.DTO.ProviderDTO->DAL.EF Entities.ProviderEntity(目标成员列表)未映射属性:GoodAndProviders=================================================================================================GoodAndProviderEntity->ProviderDTO(目标成员列表)DAL.EF.Entities.GoodAndProviderEntity->Core.DTO.ProviderDTO(目标成员列表)

如何为多对多关系创建映射


您好,Anton

您正在使用当前代码将GoodAndProviderEntity映射到ProviderDTO

Mapper.CreateMap<GoodEntity, GoodDTO>()
  .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders));
Mapper.CreateMap()
.ForMember(dto=>dto.providers,opt=>opt.MapFrom(x=>x.GoodsAndProviders));
您要做的是将ProviderEntity映射到ProviderDTO,因此您只需从Goods和Providers中选择提供者作为列表:

    Mapper.CreateMap<GoodEntity, GoodDTO>()
      .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders.Select(y => y.Providers).ToList()));
Mapper.CreateMap()
.ForMember(dto=>dto.providers,opt=>opt.MapFrom(x=>x.GoodsAndProviders.Select(y=>y.providers.ToList());

公司
变量上使用
Shift
+
F12
时会发生什么?这应该会告诉你它的定义。安德鲁,我不能这么做,因为我没有答案的源代码。我建议做一些编辑来帮助你得到答案:1)删除你问题的开头,在那里你引用了另一个问题的答案。如果看不到所有的代码,我们就无法告诉您
公司的来源。2) 请提供源类和目标类的完整定义(而不仅仅是它们如何相关的图形)。3) 显示映射方式、示例数据以及映射失败的位置。4) 请确保您正在调用Mapper.AssertConfigurationsValid(),以确保您的映射配置正确。@Patrick Steele,我编辑了您所说的问题,谢谢。如果我有多对多联接,并且在Good和ProviderEntity中存储了其他字段信息,示例GoodAndProviderEntity.IsMapped您知道AutoMapper如何将该值从中间的多对多字段引入GoodTo吗?这非常有效现在您如何使用多对多导航属性反向(dto到实体)?@goodies4uall您找到了一种相反的方法吗?我也在找同样的thing@pantonis我更新了答案,以显示当转到另一个方向时如何忽略多对多关系。我的缺点是我没有包括所有的表,因此这会给我列出[null,null]和null值。请确保包括,然后包括这两个表。否则,这就像一个符咒
Mapper.CreateMap<ProviderDTO, ProviderEntity>();
Mapper.CreateMap<ProviderEntity, ProviderDTO>();

Mapper.CreateMap<GoodEntity, GoodDTO>()
      .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders));
Mapper.CreateMap<GoodAndProviderEntity, ProviderDTO>();
Mapper.CreateMap<GoodEntity, GoodDTO>()
  .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders));
    Mapper.CreateMap<GoodEntity, GoodDTO>()
      .ForMember(dto => dto.providers, opt => opt.MapFrom(x => x.GoodsAndProviders.Select(y => y.Providers).ToList()));