AutoMapper ProjectUsing未被调用

时间:2015-02-05 12:58:23

标签: c# unit-testing automapper

我正在尝试使用AutoMapper的ProjectUsing功能,只通过LINQ表达式选择我需要的列,但似乎表达式本身不会在运行时或通过单元测试调用。

作为测试,我只是将一个固定值放入AlternateId属性,但下面的断言总是失败。对于单个实例(不在可查询列表中)以及在运行时通过Entity Framework 6,这也会失败。

    class MapFrom
    {
        public int Id { get; set; }
    }
    class MapTo
    {
        public int AlternateId { get; set; }
    }

    [TestMethod]
    public void Automapper_projectusing_test()
    {
        AutoMapper
            .Mapper
            .CreateMap<MapFrom, MapTo>()
            .ProjectUsing(src => new MapTo { AlternateId = 88 });
        var products = new List<MapFrom>();
        products.Add(new MapFrom());

        var mapped = products
            .AsQueryable()    // Just in case ProjectUsing only works with IQueryable.
            .Project()
            .To<MapTo>()
            .ToList();

        Assert.AreEqual(88, mapped.Single().AlternateId); // Fails, AlternateId equals 0.
    }

使用AutoMapper v3.3.1,NCrunch确认永远不会执行映射表达式代码。

为什么AutoMapper没有执行这个表达式,也许我错过了一个关键步骤?

2 个答案:

答案 0 :(得分:1)

根据Jimmy Bogarde的说法,这是按照设计工作的,你需要ConstructUsing。&#39;。看到 https://github.com/AutoMapper/AutoMapper/issues/677#event-289561571

显然,它把我们全部抓了出来,所以我认为这里的文件可以更加清晰。

答案 1 :(得分:0)

我试图做同样的事情并遇到了这个问题,也无法弄明白。我下载了Automapper源代码并查看了相关的测试。

    public ProjectEnumTest()
    {
        Mapper.CreateMap<Customer, CustomerDto>();
        Mapper.CreateMap<CustomerType, string>().ProjectUsing(ct => ct.ToString().ToUpper());
    }

    [Fact]
    public void ProjectingEnumToString()
    {
        var customers = new[] { new Customer() { FirstName = "Bill", LastName = "White", CustomerType = CustomerType.Vip } }.AsQueryable();

        var projected = customers.Project().To<CustomerDto>();
        projected.ShouldNotBeNull();
        Assert.Equal(customers.Single().CustomerType.ToString().ToUpper(), projected.Single().CustomerType);
    }

简短的回答是,这似乎只适用于成员级映射而不是第一级映射?用下面的映射替换不起作用。预计值只是具有null属性的CustomerDto对象。

 Mapper.CreateMap<Customer, CustomerDto>().ProjectUsing(c => new CustomerDto{FirstName = "Test"});

从此处列出的文章:http://lostechies.com/jimmybogard/2014/12/23/automapper-3-3-feature-projection-conversions/我认为上述功能可能是有意的,但不起作用。要么是这样,要么我们对它的工作原理的理解存在配置问题。