[英]Exception using AutoMapper with Entity Framework
I am trying to include Automapper into project using Entity Framework, this is my DTO class: 我正在尝试使用Entity Framework将Automapper包含到项目中,这是我的DTO类:
public class FunctionDto
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string Comment { get; set; }
public DateTime? ExaminationDate { get; set; }
public string Place { get; set; }
}
And domain class with code first: 并首先使用代码的域类:
public class Function
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string Comment { get; set; }
public DateTime? ExaminationDate { get; set; }
public string Place { get; set; }
public virtual List<Employee> Employees { get; set; }
}
Automapper configuration: 自动映射器配置:
public static class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(config => config.AddProfile<FunctionProfile>());
}
}
public class FunctionProfile : Profile
{
protected override void Configure()
{
CreateMap<Function, FunctionDto>()
.ForMember(dto => dto.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dto => dto.Name, opt => opt.MapFrom(src => src.Name))
.ForMember(dto => dto.Comment, opt => opt.MapFrom(src => src.Comment))
.ForMember(dto => dto.StartDate, opt => opt.MapFrom(src => src.StartDate))
.ForMember(dto => dto.EndDate, opt => opt.MapFrom(src => src.EndDate))
.ForMember(dto => dto.ExaminationDate, opt => opt.MapFrom(src => src.ExaminationDate))
.ForMember(dto => dto.Place, opt => opt.MapFrom(src => src.Place));
}
}
Then use in WebApi: 然后在WebApi中使用:
var functionDtos = functions
.AsQueryable()
.OrderBy(sort)
.Skip(start)
.Take(count)
.ToList()
.Select(Mapper.Map<FunctionDto>);
Of course I have register in Global: 我当然已经在Global注册了:
AutoMapperConfiguration.Configure();
But I got the exception: 但是我有一个例外:
Missing type map configuration or unsupported mapping
缺少类型映射配置或不支持的映射
What is wrong with the code above? 上面的代码有什么问题?
Can you please confirm what functions
is as the following passes: 您能否通过以下步骤确认其
functions
:
MapperConfiguration.cs MapperConfiguration.cs
namespace StackOverflow.Function
{
using AutoMapper;
public class MyProfile : Profile
{
protected override void Configure()
{
CreateMap<Function, FunctionDto>();
}
}
}
MappingTests.cs MappingTests.cs
[TestFixture]
public class MappingTests
{
[Test]
public void AutoMapper_Configuration_IsValid()
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
}
[Test]
public void AutoMapper_Mapping_IsValid()
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
var functions = new List<Function>
{
new Function
{
Comment = "Stack Overflow Rocks",
EndDate = new DateTime(2012, 01, 01),
ExaminationDate = new DateTime(2012, 02, 02),
Id = 1,
Name = "Number 1",
Place = "Here, there and everywhere",
StartDate = new DateTime(2012, 03, 03)
},
new Function
{
Comment = "As do I",
EndDate = new DateTime(2013, 01, 01),
ExaminationDate = new DateTime(2013, 02, 02),
Id = 2,
Name = "Number 2",
Place = "Nowhere",
StartDate = new DateTime(2013, 03, 03)
}
};
var functionDtos = functions
.AsQueryable()
.OrderBy(x => x.Id)
.Skip(1)
.Take(1)
.ToList()
.Select(Mapper.Map<FunctionDto>);
Assert.That(functionDtos, Is.Not.Null);
Assert.That(functionDtos.Count(), Is.EqualTo(1));
Assert.That(functionDtos.First().Id, Is.EqualTo(2));
}
}
Try this Configure()
method, 试试这个
Configure()
方法,
Note: If the Function, FunctionDto
has same name properties you do not need to map. 注意:如果
Function, FunctionDto
具有相同的名称属性,则无需映射。 AutoMapper
will take care mapping. AutoMapper
将注意映射。
protected override void Configure()
{
CreateMap<Function, FunctionDto>().IgnoreAllNonExisting();
}
-- -
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType));
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.