C#-ProjectTo无法识别无参数构造函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-ProjectTo无法识别无参数构造函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1564字,纯文字阅读大概需要3分钟。
内容图文
我有一个用于从数据库获取数据的类,它看起来像这样(为了简单起见,缺少一些字段):
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: 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<BranchDetail, BranchDetailDto>();
或使用ConstructProjectionUsing方法让AM在投影到DTO的过程中使用无参数构造函数:
cfg.CreateMap<BranchDetail, BranchDetailDto>()
.ConstructProjectionUsing(src => new BranchDetailDto());
内容总结
以上是互联网集市为您收集整理的C#-ProjectTo无法识别无参数构造函数全部内容,希望文章能够帮你解决C#-ProjectTo无法识别无参数构造函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。