You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:35:23