如何在Prisma中使用TypeScript Automapper(nartc/mapper)
Prisma与Automapper配合实现模型-DTO双向映射的可行方案
当然可以将Prisma与Automapper配合使用,核心是用映射配置类替代装饰器来定义映射规则,无需修改Prisma自动生成的模型文件,具体实现方式如下:
1. 使用Automapper配置类定义映射规则
Automapper支持通过代码配置的方式建立Prisma模型与DTO之间的映射关系,不需要在生成的模型上添加装饰器。示例代码如下:
import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; import { createMap, forMember, mapFrom, Mapper } from '@automapper/core'; // 导入Prisma自动生成的模型和自定义DTO import { User as PrismaUser } from '@prisma/client'; import { UserDto } from './dto/user.dto'; export class UserMappingProfile extends AutomapperProfile { constructor(@InjectMapper() mapper: Mapper) { super(mapper); } override get profile() { return (mapper) => { // 配置Prisma模型到DTO的映射 createMap(mapper, PrismaUser, UserDto, // 示例:处理组合字段 forMember(dest => dest.fullName, mapFrom(src => `${src.firstName} ${src.lastName}`)) ); // 配置DTO到Prisma模型的双向映射 createMap(mapper, UserDto, PrismaUser); }; } }
2. 注册配置类到应用中
在NestJS(Automapper最常用的框架场景)中,只需将配置类添加到模块的providers数组即可生效:
import { Module } from '@nestjs/common'; import { AutomapperModule } from '@automapper/nestjs'; import { classes } from '@automapper/classes'; import { UserMappingProfile } from './user-mapping.profile'; @Module({ imports: [ AutomapperModule.forRoot({ strategyInitializer: classes(), }), ], providers: [UserMappingProfile], }) export class AppModule {}
3. 使用映射功能
在服务中注入Mapper实例,即可完成双向映射:
import { Injectable } from '@nestjs/common'; import { InjectMapper } from '@automapper/nestjs'; import { Mapper } from '@automapper/core'; import { PrismaService } from './prisma.service'; import { UserDto } from './dto/user.dto'; @Injectable() export class UserService { constructor( private prisma: PrismaService, @InjectMapper() private mapper: Mapper ) {} async getUser(id: number): Promise<UserDto> { const prismaUser = await this.prisma.user.findUnique({ where: { id } }); // Prisma模型转DTO return this.mapper.map(prismaUser, UserDto, PrismaUser); } async createUser(userDto: UserDto): Promise<UserDto> { // DTO转Prisma模型 const prismaUser = this.mapper.map(userDto, PrismaUser, UserDto); const createdUser = await this.prisma.user.create({ data: prismaUser }); return this.mapper.map(createdUser, UserDto, PrismaUser); } }
核心原理
Automapper的classes策略可以基于TypeScript的类型信息进行映射,无需依赖装饰器元数据。通过配置类显式定义字段映射关系,完全避开了Prisma生成模型不可修改的限制,同时实现双向映射需求。
内容的提问来源于stack exchange,提问作者Vlad Mosienko
相关产品推荐
相关产品推荐

