我有一个用户实体,该实体具有一个userRoles数组作为数据成员。用户存储在数据库中的名为users的表中,而user_roles存储在名为user_role_mapping的表中。我想与typeorm建立一对多关系,以便在将用户保存到数据库中时还将其相应的userRoles保存在各自的表中。我无法使其正常工作。
这是我的用户实体
@Entity("users",{schema:"Cellphones" } )
@Index("net_id",["netId",],{unique:true})
export class User {
@PrimaryGeneratedColumn({
type:"int",
name:"id"
})
id: number;
@Column("varchar",{
nullable:false,
unique: true,
length:20,
name:"net_id"
})
netId: string;
@Column("varchar",{
nullable:true,
length:20,
name:"employee_id"
})
employeeId: string | null;
@Column("varchar",{
nullable:false,
length:50,
name:"first_name"
})
firstName: string;
@Column("varchar",{
nullable:false,
length:50,
name:"last_name"
})
lastName: string;
@Column("varchar",{
nullable:true,
length:50,
name:"title"
})
title: string | null;
@Column("tinyint",{
nullable:false,
width:1,
name:"active"
})
active: boolean;
@Column("varchar",{
nullable:true,
length:100,
name:"email"
})
email: string | null;
@Column("varchar",{
nullable:true,
length:20,
name:"phone"
})
phone: string | null;
@Column("date",{
nullable:true,
name:"term_date"
})
termDate: Date | null;
@Column("varchar",{
nullable:true,
length:10,
name:"term_department"
})
termDepartment:string | null;
@Column("date",{
nullable:true,
name:"retire_date"
})
retireDate: Date | null;
@Column("date",{
nullable:false,
name:"last_login"
})
lastLogin: Date;
@Column("varchar",{
nullable:false,
length:50,
name:"employee_status"
})
employeeStatus:string;
@Column("varchar",{
nullable:false,
length:50,
name:"department"
})
department:string;
@Column("varchar",{
nullable:true,
length:10,
name:"pay_group"
})
payGroup:string | null;
@Column("datetime",{
nullable:true,
name:"updated"
})
updated:Date | null;
@Column("int",{
nullable:true,
name:"updated_by"
})
updatedBy:number | null;
@Column("date",{
nullable:true,
name:"inactivated"
})
inactivated:Date | null;
@Column("int",{
nullable:true,
name:"inactivated_by"
})
inactivatedBy:number | null;
@OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.userId)
userRoles: UserRoleMapping[];
}
这是我的UserRoleMapping实体:
@ManyToOne(type => User, user => user.userRoles)
@Entity("user_role_mapping",{schema:"Cellphones" } )
export class UserRoleMapping {
constructor(id: number, userId: number, roleId: number) {}
@PrimaryGeneratedColumn({
type:"int",
name:"id"
})
id: number;
@Column({
type:"int",
name:"user_id"
})
userId: number;
@Column({
type:"int",
name:"role_id"
})
roleId: number;
}
这是users表的样子:
这是user_role_mapping表的外观:
请注意,任何名称以old_开头的列仅用于数据迁移,与该项目无关。
答案 0 :(得分:0)
实体UserRoleMapping
的定义中存在一些错误:
schema
的{{1}}选项。如果您对与实体属性名称不同的列和表更喜欢使用custom naming strategy,则可以在TypeORM配置中全局定义它。对于较小的调整,您可以从DefaultNamingStrategy中得出。
答案 1 :(得分:0)
这是使关系正常工作的代码。
在用户中:
@OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.user,
{ eager: true, cascade: true})
userRoles: UserRoleMapping[];
在UserRoleMapping中:
@ManyToOne(type => User, user => user.userRoles)
@JoinColumn({ name: "user_id", referencedColumnName: "id"})
user: User;
关键是将关系修饰符移动到用户字段并定义@JoinColumn。