C# 自动映射-缺少类型映射配置或映射不受支持
我已经为此挣扎了一天,但毫无结果。我是Automapper的新手,正在尝试将EF域对象映射到viewModel,但收到以下异常: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
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();
}
}