【发布时间】:2021-12-16 12:48:37
【问题描述】:
我正在使用 NestJS 和 TypeORM 创建一个小型应用程序,但在插入具有复合外键的表时遇到问题。
每当执行插入时,所有列都会被填充,除了外键,外键保持为null。
这是我的实体:
员工
import { Column, Entity, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm';
@Entity({ name: 'employees' })
export class Employee {
@PrimaryGeneratedColumn('uuid')
id: string;
@PrimaryColumn()
version: number;
@Column({ name: 'employee_name', type: 'varchar' })
employeeName: string;
@Column({ name: 'employee_salary', type: 'numeric' })
employeeSalary: string;
}
员工工资
import {
Column,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { Employee } from '../../employee/entities/employee.entity';
@Entity({ name: 'employee_payrolls' })
export class EmployeePayroll {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'employee_payroll_name', nullable: true })
employeePayrollName: string;
@ManyToOne(() => Employee)
@JoinColumn([
{ name: 'employee_id', referencedColumnName: 'id' },
{ name: 'employee_version', referencedColumnName: 'version' },
])
employee: Employee;
}
员工薪资服务
这是插入的代码:
export class EmployeePayrollDTO {
employeePayrollName: string;
employeeId: string;
employeeVersion: number;
}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EmployeePayrollDTO } from 'src/employee-payroll/dto/employee-payroll.dto';
import { EmployeePayroll } from 'src/employee-payroll/entities/employee-payroll.entity';
import { Repository } from 'typeorm';
@Injectable()
export class EmployeePayrollService {
constructor(
@InjectRepository(EmployeePayroll)
private readonly employeeRepository: Repository<EmployeePayroll>,
) {}
async addEmployeePayroll(employeePayroll: EmployeePayrollDTO) {
return await this.employeeRepository
.createQueryBuilder()
.insert()
.into(EmployeePayroll)
.values(employeePayroll)
.execute();
}
}
问题
问题是,虽然插入成功,但列的值:employee_id 和 employee_version 为空:
| id | employee_payroll_name | employee_id | employee_version |
|---|---|---|---|
| 53de51fd-6c9e-4b96-8906-edd1f6eea26c | Payroll 1 | null |
null |
| 64b8a147-acee-4f43-9ea1-b64c2c036369 | Payroll 2 | null |
null |
你能帮帮我吗?
【问题讨论】:
-
我猜提供给
.values的对象必须遵循EmployeePayroll的形状。因此,您需要将该 DTO 映射到{ employeePayrollName: employeePayroll.employeePayrollName:, employee: { id: employeePayroll.employeeId, version: employeePayroll.employeeVersion } }您可以使用像 AutoMapper 这样的对象到对象映射器来执行此操作。 -
是的,这就是问题所在。我现在已经设法让它工作了。感谢您的帮助。