1

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; }
}

そして、最初にコードを含むドメイン クラス:

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; }
}

オートマッパーの構成:

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

次に、WebApi で使用します。

var functionDtos = functions
            .AsQueryable()
            .OrderBy(sort)
            .Skip(start)
            .Take(count)
            .ToList()
            .Select(Mapper.Map<FunctionDto>);

もちろん、私はグローバルに登録しています:

 AutoMapperConfiguration.Configure();

しかし、私は例外を得ました:

タイプ マップの設定がないか、マッピングがサポートされていません

上記のコードの何が問題になっていますか?

4

2 に答える 2

0

Configure()この方法を試して、

注:Function, FunctionDtoに同じ名前のプロパティがある場合は、マップする必要はありません。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;
    }
于 2012-11-30T05:27:01.693 に答える
0

functions次のパスの内容を確認していただけますか。

MapperConfiguration.cs

namespace StackOverflow.Function
{
    using AutoMapper;

    public class MyProfile : Profile
    {
        protected override void Configure()
        {
            CreateMap<Function, FunctionDto>();
        }
    }
}

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));
    }
}
于 2012-11-30T01:42:13.897 に答える