Как предоставить столбец внешнего ключа в сущности в TypeORM

#typeorm

#typeorm

Вопрос:

Мне не удалось предоставить столбец внешнего ключа в сущности, что, как мне кажется, странно, что я не могу этого сделать.

Если я не хочу загружать отношение, по крайней мере, я должен иметь возможность увидеть imageId , чтобы иметь некоторое представление о существовании отношения. поэтому, когда я делаю a userRepository.findOne({email: emailaddress}) , даже я знаю, что не могу eager load таким образом отобразить изображение. Но, по крайней мере, я мог видеть imageId .

 @Column('datetime', { nullable: true, name: 'last_login' })
lastLogin: string;

@OneToOne(() => UserSetting)
@JoinColumn({ name: 'setting_id' })
setting: UserSetting;

@OneToOne(() => UserImage, { onDelete: 'SET NULL' })
@JoinColumn({ name: 'image_id' })
image: UserImage;

imageUrl: { preview: string, thumbnail: string };

@OneToMany(() => Contact, contact => contact.user)
contacts: Contact[];

@OneToMany(() => Notification, notification => notification.user)
notifications: Notification[];
 

Как вы можете видеть, не imageId определено. Я попытался выразить это так. База данных просто не может быть синхронизирована, и она также уничтожила все мои данные изображения.

 @Column({name: 'image_id' })
imageId: string;

@OneToOne(() => UserImage, { onDelete: 'SET NULL' })
@JoinColumn({ name: 'image_id' })
image: UserImage;
 

Я упускаю что-то простое здесь?

Ответ №1:

Ваш User Entity должен выглядеть так:

 @Column({ nullable: true })
imageId: string;

@OneToOne(() => UserImage, userImage=> userImage.user, { onDelete: 'SET NULL' })
@JoinColumn({ name: 'image_id' })
image: UserImage;
 

и в вашем UserImage Entity :

 @OneToOne(() => User, user=> user.image)
user: User;
 

Комментарии:

1. Пробовал это. Это нарушает работу базы данных. ImageID также должен добавить {name: ‘image_id’}, верно?

2. Вы правы. Я пропустил nullable: true часть. Но после его добавления данные идентификатора изображения исчезли.

3. Возможно, вам также следует установить значение по умолчанию.

4. Для записи это происходит при создании сущности. Не для его изменения. Если вы все еще работаете в режиме автоматической миграции, добавление столбца внешнего ключа приведет к удалению всех данных столбца внешнего ключа.