我正在使用ASP.NET Core 6开发web API。我正在使用库自动映射程序。当我试图将我的类DTO转换为实体类时,我收到一个错误,因为Automapper无法识别和转换枚举。
错误:
AutoMapper.AutoMapperMappingException:映射类型错误。
映射类型:CreateRequestUserDto->使用者api。DTOs.CreateRequestUserDto->api。型号实体用户
类型映射配置:CreateRequestUserDto->使用者api。DTOs.CreateRequestUserDto->api。型号实体用户
目标成员:角色
--->AutoMapper.AutoMapperMappingException:缺少类型映射配置或不支持的映射。
映射类型:EnumRoles->角色api。Utilitis.Enum.EnumRoles->api。型号实体实体实体
实体类User.cs:
namespace api.Model.Entity;
public class User
{
public int Id { get; set; }
//other attributes
public virtual Role Role { get; set; }
}
实体类Role.cs:
using api.Utilitis.Enum;
public class Role
{
public int Id { get; set; }
[Column("Name", TypeName = "nvarchar(50)")]
public EnumRoles Name { get; set; }
public ICollection<User> Users{ get; set; }
}
DTO类CreateRequestUserDto.cs:
using api.Utilitis.Enum;
namespace api.DTOs;
public class CreateRequestUserDto
{
//other attributes
public EnumRoles Role { get; set; }
}
AutoMapperProfile.cs:
public AutoMapperProfile()
{
CreateMap<User, CreateRequestUserDto>()
.ForMember(cr => cr.Role, opt => opt.MapFrom(usr => usr.Role.Name)).ReverseMap();
//other codes
}
枚举.cs:
namespace api.Utilitis.Enum;
public enum EnumRoles {
Administrator = 1,
Operator = 2
}
用户控制器.cs:
public async Task<ActionResult> Create([FromForm] CreateRequestUserDto request)
{
var user = _mapper.Map<User>(request);
var result = await _userService.CreateUser(user);
return Ok(new { message = result.Message });
}
ServiceUser.cs:
public async Task<(bool Success, string Message)> CreateUser(User user)
{
try
{
_context.Users.Add(user);
await _context.SaveChangesAsync();
return (true, "User added");
} catch(Exception ex)
{
return (false, ex.Message);
}
}
我错了什么?
您错过了从EnumRoles
到Roles
的映射。
添加从EnumRoles
到Roles
的映射,如下所示:
CreateMap<EnumRoles, Role>()
.ConstructUsing((src, dest) => new Role { Id = (int)src });
.NET Fiddle 示例
要插入Role
问题的重复条目,请考虑您需要通过Id
查询Role
,然后将其附加到user
。
ServiceUser.cs
public async Task<(bool Success, string Message)> CreateUser(User user)
{
try
{
var role = _context.Roles.Single(x => x.Id == user.Role.Id);
user.Role = role;
_context.Users.Add(user);
await _context.SaveChangesAsync();
return (true, "User added");
}
catch(Exception ex)
{
return (false, ex.Message);
}
}