Automapper - 缺少类型映射配置或不受支持的映射

jgi*_*l09 5 c# asp.net-mvc entity-framework automapper

已经为此苦苦挣扎了一天,但毫无结果。我是 Automapper 的新手,我正在尝试使用 viewModel 映射 EF 域对象,但收到以下异常:

Missing type map configuration or unsupported mapping.\r\n\r\nMapping types:\r\nCatalogueDefinitionFile -> CatalogueDefinitionFileViewModel\r\nDigital.PriceBuilder.Core.Domain.CatalogueDefinitionFile -> Digital.PriceBuilder.Web.Models.CatalogueDefinitionFileViewModel"}
Run Code Online (Sandbox Code Playgroud)

CatalogueDefinitionFile 的域 POCO 是:

public class CatalogueDefinitionFile : BaseEntity
{
    public CatalogueDefinitionFile()
    {
        this.ProductDefinitions = new List<ProductDefinition>();            
    }

    public string TargetApplication { get; set; }

    public virtual IList<ProductDefinition> ProductDefinitions { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

基础实体:

public abstract class BaseEntity
{
    public BaseEntity()
    {
        this.CreatedDate = DateTime.Now;
        this.UpdatedDate = DateTime.Now;
        this.IsActive = true;
    }

    public int Id { get; set; }

    public string Name { get; set; }

    public bool IsActive { get; set; }

    public DateTime CreatedDate { get; set; }

    public string CreatedBy { get; set; }

    public DateTime UpdatedDate { get; set; }

    public string UpdatedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个个人资料:

public class DomainToViewModelMappingProfile : Profile
{
    public override string ProfileName
    {
        get
        {
            return "DomainToViewModelMappings";
        }
    }

    public DomainToViewModelMappingProfile()
    {
        ConfigureMappings();
    }


    /// <summary>
    /// Creates a mapping between source (Domain) and destination (ViewModel)
    /// </summary>
    private void ConfigureMappings()
    {
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<ProductDefinition, ProductDefinitionViewModel>().ReverseMap();
            cfg.CreateMap<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>().ReverseMap();

        });

        IMapper mapper = config.CreateMapper();

        mapper.Map<ProductDefinition, ProductDefinitionViewModel>(new ProductDefinition());
        mapper.Map<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>(new CatalogueDefinitionFile());


    }
}
Run Code Online (Sandbox Code Playgroud)

Profile 是 AutoMapperConfiguration 类中的引用,然后在 Global.asax 中引用:

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        // Create Automapper profiles
        Mapper.Initialize(m =>
        {
            m.AddProfile<DomainToViewModelMappingProfile>();
            m.AddProfile<ViewModelToDomainMappingProfile>();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

viewModel 看起来像这样:

public class CatalogueDefinitionFileViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string TargetApplication { get; set; }

    public bool IsActive { get; set; }

    public DateTime CreatedDate { get; set; }

    public string CreatedBy { get; set; }

    public DateTime UpdatedDate { get; set; }

    public string UpdatedBy { get; set; }

    public virtual IList<ProductDefinition> ProductDefinitions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中我有这个:

public ActionResult Index()
    {
        IEnumerable<CatalogueDefinitionFileViewModel> viewModel = null;
        IEnumerable<CatalogueDefinitionFile> files;

        files = _catalogueDefinitionFileService.GetCatalogueDefinitionFiles();

        viewModel = Mapper.Map<IEnumerable<CatalogueDefinitionFile>, IEnumerable<CatalogueDefinitionFileViewModel>>(files);

        return View(viewModel);
    }
Run Code Online (Sandbox Code Playgroud)

异常被抛出

viewModel = Mapper.Map<IEnumerable<CatalogueDefinitionFile>, IEnumerable<CatalogueDefinitionFileViewModel>>(files);
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解为什么会发生这种情况吗?

提前致谢。

Cha*_*leh 1

您的个人资料不会执行任何操作:

public class DomainToViewModelMappingProfile : Profile
{
// etc ...
    private void ConfigureMappings()
    {
        // You are just creating a local mapper config/instance here and then discarding it when it goes out of scope...
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<ProductDefinition, ProductDefinitionViewModel>().ReverseMap();
            cfg.CreateMap<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>().ReverseMap();    
        });

        // I assume this is just test code
        IMapper mapper = config.CreateMapper();    
        mapper.Map<ProductDefinition, ProductDefinitionViewModel>(new ProductDefinition());
        mapper.Map<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>(new CatalogueDefinitionFile());  
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试这个:

public class DomainToViewModelMappingProfile : Profile
{
    public override string ProfileName
    {
        get
        {
            return "DomainToViewModelMappings";
        }
    }

    public DomainToViewModelMappingProfile()
    {
        ConfigureMappings();
    }


    /// <summary>
    /// Creates a mapping between source (Domain) and destination (ViewModel)
    /// </summary>
    private void ConfigureMappings()
    {
        CreateMap<ProductDefinition, ProductDefinitionViewModel>().ReverseMap();
        CreateMap<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>().ReverseMap();
    }
}
Run Code Online (Sandbox Code Playgroud)

您继承的类型Profile可能与地图配置对象相关(因此具有相似/相同的本地方法)。

免责声明:我有一段时间没有使用 Automapper,但上述问题似乎是您的问题。