ProjectTo无法识别无参数构造函数

时间:2017-11-07 09:51:49

标签: c# entity-framework linq automapper

我有一个从DB获取数据的类,看起来像这样(为了保持简单,缺少一些字段):

public class BranchDetailDto
{
    public BranchDetailDto()
    {
    }

    public BranchDetailDto(int supplierId, string supplierName)
    {
        SupplierId = supplierId;
        SupplierName = supplierName;
    }

    public int Id { get; set; }

    public int SupplierId { get; set; }

    public string SupplierName { get; set; }
}

然后我想在查询中检索数据并使用AutoMapper的ProjectTo扩展方法:

return await _context.Branches
            .Where(b => b.Id == message.Id)
            .ProjectTo<BranchDetailDto>(_configuration)
            .SingleAsync();

但是,此操作会抛出错误并显示错误页面:

  

NotSupportedException:LINQ to Entities中仅支持无参数构造函数和初始值设定项。

为什么呢?我的类确实有一个无参数构造函数。 AutoMapper有可能看不到它吗?或者它只是在定义中只需要一个构造函数而第二个是在制造麻烦吗?这听起来很奇怪。

修改

Automapper版本是6.1.1,Automapper.EF6是1.0.0。 配置没什么特别之处,关于这种类型,地图应该自动创建,因为所有字段都可以通过命名约定来映射(当然,cfg中的CreateMissingTypeMaps设置为true)。

但是,我已经用参数评论了第二个构造函数,它已经开始工作了。所以它真的与第二个构造函数混淆了,但我相信它不是一个预期的行为(能够在一个类中只有一个构造函数)。

1 个答案:

答案 0 :(得分:3)

默认情况下,AM尽可能使用constructor mapping,因此在您的情况下,它会尝试使用带有参数的DTO构造函数,而EF不支持这些参数。

要解决此问题,请全局禁用构造函数映射(如链接中所述):

cfg.DisableConstructorMapping();
cfg.CreateMap<BranchDetail, BranchDetailDto>();

或使用ConstructProjectionUsing方法让AM在投影期间使用无参数构造函数来定位DTO:

cfg.CreateMap<BranchDetail, BranchDetailDto>()
    .ConstructProjectionUsing(src => new BranchDetailDto());