从 .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
如果没有看到实体和模型中的属性,很难说,但你可以尝试这个:
var userRoleMappingsModel = _mapper.Map<List<UserRoleMappingModel>>(user.UserRoleMappings);
我查看了 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 语句,以直接从查询自动构建所需的视图模型。