【问题标题】:Missing type map configuration or unsupported mapping in Automapper 5.0.2Automapper 5.0.2 中缺少类型映射配置或不支持的映射
【发布时间】:2016-11-17 11:57:52
【问题描述】:

我在我的 OData API 中使用 AutoMapper。我发现了许多具有相同标题的问题并尝试了所有解决方案,但我的问题没有得到解决。我正在使用最新的 AutoMapper 版本 5.0.2。请让我知道我哪里出错了。

这是我的代码:

Startup.cs

public static partial class Startup
{
    public static void ConfigureApp(IAppBuilder appBuilder)
    {
       ConfigureAuth(appBuilder);
        AutoMapperWebConfiguration.Configure();
        Mapper.AssertConfigurationIsValid();

        // Config OData       
        ConfigureOData(config);
     }
}

AutoMapperWebConfiguration.cs

public static class AutoMapperWebConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(
            config =>
            {
                config.CreateMap<ContractType, ContractTypeDto>().ReverseMap();
            });         

    }
}

ContractTypeController.cs

public class ODataContractTypeController : ODataController
{
    [ODataRoute]
    [EnableQuery]
    public IHttpActionResult Get()
    {
        var returnResult = db.ContractTypes;          
        var result = Mapper.Map<ContractTypeDto>(returnResult);

        return result; 
    }
}

谢谢

【问题讨论】:

  • 您使用的是 EF 吗?因为如果是这样,那么类型不是ContractType,而是ContractType0123456789etc,因为EF 代理了该类。如果是这样,请在合约类型上调用 ToList() 以获取实际类,或使用 Projection

标签: c# odata automapper-5


【解决方案1】:

您正在尝试映射 T 的可枚举,而不仅仅是 T。试试这个

[ODataRoute]
[EnableQuery]
public IHttpActionResult Get()
{
    var returnResult = db.ContractTypes.ToArray();
    var result = Array.ConvertAll(returnResult, Mapper.Map<ContractTypeDto>);       

    return result;     
}

【讨论】:

  • Mapper.Map&lt;List&lt;ContractTypeDto&gt;&gt;(returnResult.ToList());?
  • 如果我使用 ToList 或 ToArray 那么它会工作,但我正在处理 OData 项目所以我得到 DbSet 即在这里创建只是查询: var returnResult = db.ContractTypes;并且在处理数据库时会命中数据库。所以我不能在这里使用 ToList 和 ToArray。
  • 无论如何你都会命中 db。如果不是显式(通过 ToList 或 Toarray),则隐式(AutoMapper 将枚举 dbset 进行映射)。所以你可以安全地调用 ToArray。
  • 当我使用 ToList 或 ToArray 时,会花费大量时间。当我只返回实体时,它需要 4 到 5 秒,但是当我使用 ToList/ToArray() 将实体映射到 DTO 时,它需要 1.4 分钟。那么请你解释一下为什么会这样?
  • “当我只返回实体时......”是什么意思?当您调用 ToList/ToArray 时,开始真正调用数据。在这一行var returnResult = db.ContractTypes; 没有调用发生。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 2017-04-16
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2015-05-07
相关资源
最近更新 更多