热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我有一个用于从数据库获取数据的类,它看起来像这样(为了简单起见,缺少一些字段):publicclassBranchDetailDto{pub

我有一个用于从数据库获取数据的类,它看起来像这样(为了简单起见,缺少一些字段):

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(_configuration)
.SingleAsync();

但是,此操作将引发错误,并且错误页面显示:

NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities.

为什么?我的课程确实有一个无参数的构造函数. AutoMapper是否可能看不到它?还是只需要一个构造函数,而第二个就麻烦了?对我来说听起来很奇怪.

编辑

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

但是,我用参数注释了第二个构造函数,它开始起作用.因此,它确实与第二个构造函数有些混淆,但是我认为这不是预期的行为(一个类中只能有一个构造函数).

解决方法:

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

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

cfg.DisableConstructorMapping();
cfg.CreateMap();

或使用ConstructProjectionUsing方法让AM在投影到DTO的过程中使用无参数构造函数:

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


推荐阅读
author-avatar
彭雅静政颖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有