C# 自动映射-缺少类型映射配置或映射不受支持

C# 自动映射-缺少类型映射配置或映射不受支持,c#,asp.net-mvc,entity-framework,automapper,C#,Asp.net Mvc,Entity Framework,Automapper,我已经为此挣扎了一天,但毫无结果。我是Automapper的新手,正在尝试将EF域对象映射到viewModel,但收到以下异常: Missing type map configuration or unsupported mapping.\r\n\r\nMapping types:\r\nCatalogueDefinitionFile -> CatalogueDefinitionFileViewModel\r\nDigital.PriceBuilder.Core.Domain.Catalo

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

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"}
CatalogeDefinitionFile的域POCO为:

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

    public string TargetApplication { get; set; }

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

}
我已经创建了一个配置文件:

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());


    }
}
public类DomainToViewModelMappingProfile:Profile
{
公共重写字符串配置文件名
{
得到
{
返回“DomainToviewModelAppings”;
}
}
公共领域OvidEWModelMappingProfile()
{
配置映射();
}
/// 
///创建源(域)和目标(ViewModel)之间的映射
/// 
私有void配置映射()
{
var config=new-MapperConfiguration(cfg=>{
CreateMap().ReverseMap();
CreateMap().ReverseMap();
});
IMapper mapper=config.CreateMapper();
Map(新产品定义());
Map(新目录定义文件());
}
}
配置文件在AutoMapperConfiguration类中引用,该类随后在Global.asax中引用:

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        // Create Automapper profiles
        Mapper.Initialize(m =>
        {
            m.AddProfile<DomainToViewModelMappingProfile>();
            m.AddProfile<ViewModelToDomainMappingProfile>();
        });
    }
}
公共类自动映射器配置
{
公共静态void Configure()
{
//创建自动映射配置文件
Mapper.Initialize(m=>
{
m、 AddProfile();
m、 AddProfile();
});
}
}
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; }
}
公共类目录定义文件视图模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串TargetApplication{get;set;}
公共bool IsActive{get;set;}
公共日期时间CreatedDate{get;set;}
通过{get;set;}创建的公共字符串
公共日期时间更新日期{get;set;}
由{get;set;}更新的公共字符串
公共虚拟IList产品定义{get;set;}
}
然后在我的控制器中,我有:

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

        files = _catalogueDefinitionFileService.GetCatalogueDefinitionFiles();

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

        return View(viewModel);
    }
public ActionResult Index()
{
IEnumerable viewModel=null;
IEnumerable文件;
files=\u CatalogeDefinitionFileService.GetCatalogeDefinitionFiles();
viewModel=Mapper.Map(文件);
返回视图(viewModel);
}
异常被抛出

viewModel = Mapper.Map<IEnumerable<CatalogueDefinitionFile>, IEnumerable<CatalogueDefinitionFileViewModel>>(files);
viewModel=Mapper.Map(文件);
有人能帮我理解为什么会这样吗


提前谢谢。

我刚测试过,一切正常。下面的映射通过-

        Mapper.CreateMap<CatalogueDefinitionFile, CatalogueDefinitionFileViewModel>();

        var obj = Mapper.Map<IEnumerable<CatalogueDefinitionFileViewModel>>(new List<CatalogueDefinitionFile>{
            new CatalogueDefinitionFile
        {
            Id = 101,
            Name = "test",
            TargetApplication = "test",
            IsActive = false,
            CreatedBy = "test",
            CreatedDate = DateTime.Now,
            UpdatedBy = "test",
            UpdatedDate = DateTime.Now,
            ProductDefinitions = new List<ProductDefinition> { new ProductDefinition { MyProperty = 100 } }}
        });
Mapper.CreateMap();
var obj=Mapper.Map(新列表{
新目录定义文件
{
Id=101,
Name=“test”,
TargetApplication=“测试”,
IsActive=false,
CreatedBy=“test”,
CreatedDate=DateTime。现在,
UpdatedBy=“test”,
updateDate=DateTime。现在,
ProductDefinitions=新列表{new ProductDefinition{MyProperty=100}}
});

您的个人资料不起任何作用:

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());  
    }
}
public类DomainToViewModelMappingProfile:Profile
{
//等等。。。
私有void配置映射()
{
//您只是在这里创建一个本地映射器配置/实例,然后在它超出范围时丢弃它。。。
var config=new-MapperConfiguration(cfg=>{
CreateMap().ReverseMap();
CreateMap().ReverseMap();
});
//我假设这只是测试代码
IMapper mapper=config.CreateMapper();
Map(新产品定义());
Map(新目录定义文件());
}
}
试试这个:

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();
    }
}
public类DomainToViewModelMappingProfile:Profile
{
公共重写字符串配置文件名
{
得到
{
返回“DomainToviewModelAppings”;
}
}
公共领域OvidEWModelMappingProfile()
{
配置映射();
}
/// 
///创建源(域)和目标(ViewModel)之间的映射
/// 
私有void配置映射()
{
CreateMap().ReverseMap();
CreateMap().ReverseMap();
}
}
您要继承的
配置文件
类型可能与映射配置对象相关(因此具有类似/相同的本地方法)


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

您的配置文件似乎并没有实际指示Automapper做任何事情-您只需创建一个本地映射器实例,然后对其不做任何操作。。。
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();
    }
}