【发布时间】:2020-04-14 19:09:12
【问题描述】:
我有一个相当简单的实体模型,其中用户拥有基本信息。如果用户还具有提供程序功能,则将创建与提供程序表的 OneToOne 关系。
我的问题是,如果我在没有任何提供程序功能的情况下更新用户,它会按预期工作。更改的字段得到更新,但没有创建新条目。如果用户具有提供程序功能,则用户的所有字段都会更新,并且不会创建新条目。在提供者信息表中,每次更新都会创建一个新条目,并在用户表中设置新 ID。
@Entity()
export class Users {
@Column('text', {primary: true})
uid: string;
@Column('text', {nullable: true})
firstName: string;
@Column('text', {nullable: true})
lastName: string;
@Column('text')
email: string;
@Column('text')
password: string;
@Column('text', {nullable: true})
role: string;
@OneToOne(type => Providers, providerData => providerData.user, {cascade: true})
@JoinColumn()
providerData: Providers;
@OneToOne(type => Clients, clientData => clientData.user, {cascade: true})
@JoinColumn()
clientData: Clients;
@Column('bytea', {nullable: true})
photo: Uint8Array;
}
更新功能:
async update(uid: string, dto: UpdateUserDto): Promise<Users> {
const userToUpdate = await this.usersRepository.findOne(uid);
try {
const user = new Users();
const provider = new Providers();
const client = new Clients();
user.email = dto.email;
user.firstName = dto.firstName;
user.lastName = dto.lastName;
user.photo = dto.photo;
user.role = dto.role;
Logger.log(dto.email);
provider.licensed = dto.licensed;
provider.notes = dto.notes;
provider.paymentOptions = dto.paymentOptions;
provider.speciality = dto.speciality;
user.providerData = provider;
user.clientData = client;
const updatedUser: Users = Object.assign(user, dto);
updatedUser.uid = uid;
Logger.log('Updated User with UID: ' + userToUpdate.uid);
return await this.usersRepository.save(updatedUser);
} catch (error) {
Logger.log('Error updating user: ' + error);
}
}
我做错了什么或者有什么更好的解决方案?
【问题讨论】:
-
您正在获取现有用户
userToUpdate,但是您不编辑现有实体,而是创建一个新实体并保存它。而是更新userToUpdate。