Context.Items 仅在使用需要 Action<IMappingOperationOptions> 的 Map 重载时才可用!考虑使用 Context.TryGetItems 代替 [关闭]

问题描述 投票:0回答:2

从 .NET 6 升级到 .NET 8 后,我收到此错误:

Context.Items 仅在使用采用 Action(IMappingOperationOptions) 的 Map 重载时才可用!考虑使用 Context.TryGetItems 代替。

通过自动映射器将实体映射到模型时。在这里我提到了从实体到模型的映射器配置文件,还添加了实体和模型以供参考

代码:

_mapper.Map<List<UserRoleMapping>, List<UserRoleMappingModel>>(user.UserRoleMappings); getting error on this line
  • UserRoleMapping
    是一个实体
  • UserRoleMappingModel
    是一个模型类
  • user.UserRoleMappings
    是上下文结果

映射器简介

CreateMap<UserRoleMapping, UserRoleMappingModel>()
     .ForMember(m => m.UserRoleName, o => o.MapFrom(src => src.UserRole.Name))
     .ForMember(m => m.UserName, o => o.MapFrom(src => src.User.Name))
     .ForMember(m => m.Guid, o => o.MapFrom(src => src.UserRole.Guid.ToString()));

实体用户角色映射

public class UserRoleMapping : AbstractEntity
{
    public virtual int UserRoleId { get; set; }
    
    public virtual UserRole UserRole { get; set; }
    
    public virtual int UserId { get; set; }
    
    public virtual User User { get; set; }
    
    public virtual bool isReadOnly { get; set; }
    public virtual bool isReadWrite { get; set; }
    public virtual bool isAdmin { get; set; }
    public virtual bool IsEnterpriseAccess { get; set; }
}

用户角色映射模型

public class UserRoleMappingModel
{
  public int UserRoleId { get; set; }
    
    public string UserRoleName { get; set; }
    
    public int UserId { get; set; }
    
    public string UserName { get; set; }
    
    public string Guid { get; set; }
    
    public bool isReadOnly { get; set; }
    
    public bool isReadWrite { get; set; }
    
    public bool isAdmin { get; set; }
    
    public bool IsEnterpriseAccess { get; set; }
}

以前它与 .net6 一起使用,我已将所有 automapper 和 efcore 包更新到最新版本 自动映射器 13.0.1 EfCore 8.0.6

linq entity-framework-core automapper .net-8.0
2个回答
0
投票

如果没有看到实体和模型中的属性,很难说,但你可以尝试这个:

var userRoleMappingsModel = _mapper.Map<List<UserRoleMappingModel>>(user.UserRoleMappings);

0
投票

我查看了 Automapper 源代码,该错误似乎是由于您的“_mapper”引用处于默认的未初始化状态。您的映射器配置文件尚未应用于该实例。检查“_mapper”模块变量的设置位置,某些代码可能会传递类似

new Mapper()
的内容,而不是您正在设置的配置中的
configuration.BuildMapper()
。默认的新映射器期望传递一个映射配置/选项的实例,类似于使用
static
方法。我怀疑这可能是引入的错误,而不是跨 .Net 版本的迁移。

使用 Automapper 的

Map
方法时,您还需要确保立即加载映射将触及的任何/所有相关实体。这至少意味着:

var users = Context.Users
    .Include(u => u.UserRoleMappings)
       .ThenInclude(urm => urm => UserRole)
    .Where(...)
    .ToList();
var userRoles = _mapper.Map<List<UserRoleMapping>, List<UserRoleMappingModel>>(user.UserRoleMappings);

更好的方法是在 EF 查询中使用 Automapper 的投影支持 (

ProjectTo
):

var userRoles = Context.Users
    .Where(...)
    .SelectMany(u => UserRoleMappings)
    .ProjectTo<UserRoleMappingModel>(config)
    .ToList();

这让 Automapper 调整 EF 生成的 SQL 语句,以直接从查询自动构建所需的视图模型。

© www.soinside.com 2019 - 2024. All rights reserved.