gpt4 book ai didi

c# - ProjectTo 不识别无参数构造函数

转载 作者:行者123 更新时间:2023-11-30 15:56:15 28 4
gpt4 key购买 nike

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

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 不识别无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154723/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com