TypeORM проблема сохранения сущности с каскадом true - PullRequest
0 голосов
/ 25 октября 2019

Я использую NestJS с TypeORM и пытаюсь сохранить беседу пользователя с сообщениями. Я установил поле сообщений в объекте беседы на каскад: true . Но когда я пытаюсь этот код:

const user3: User = { login: 'admin', createdBy: 'system', lastModifiedBy: 'system' };
const user4: User = { login: 'user', createdBy: 'system', lastModifiedBy: 'system' };
const message1: Message = { content: 'Hello How are you? ', createdBy: user3.login, lastModifiedBy: user3.login };
const conversation1: Conversation = { sender: user3, reciever: user4, messages: [message1] };
getConnection().getRepository(Conversation).save(conversation1);

Создает этот запрос:

INSERT INTO "message"("id", "createdBy", "createdDate", "lastModifiedBy", "lastModifiedDate", "content", "conversationSenderId", "conversationRecieverId", "conversationDate") VALUES (?, ?, datetime('now'), ?, datetime('now'), ?, ?, ?, ?)
-- PARAMETERS: ["67348880-6897-47cb-92ef-5f66ffb2e88c","admin","admin","Hello How are you? ","b2420445-c8ee-4080-86b3-98ab12ef576b","09f3672d-9b2f-4f68-b47e-a7ca5d806ec6","2019-10-24 14:41:40.000"]

с этой ошибкой:

{ [Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed] errno: 19, code: 'SQLITE_CONSTRAINT' }

Я вижу, что это проблема свнешний ключ таблицы сообщений, но я не могу это исправить, потому что это библиотека TypeORM, которая обрабатывает создание, а не я. Я безуспешно искал в интернете (документация, github, stackoverflow). Я думаю, что это ошибка в библиотеке TypeORM, но я новичок в этом, поэтому я предпочитаю спросить, сделал ли я что-то не так

Вот мои сущности:

export abstract class BaseEntity {
  @ObjectIdColumn()
  @PrimaryGeneratedColumn('uuid')
  id?: string;

  @Column()
  createdBy?: string;

  @CreateDateColumn()
  createdDate?: Date;

  @Column()
  lastModifiedBy?: string;

  @UpdateDateColumn()
  lastModifiedDate?: Date;
}

@Entity('user')
export class User extends BaseEntity {
  @Column()
  login?: string;

  @OneToMany(type => Conversation, conversation => conversation.sender)
  sentConversations?: Conversation[];

  @OneToMany(type => Conversation, conversation => conversation.reciever)
  recievedConversations?: Conversation[];
}

@Entity()
export class Conversation {
  @PrimaryColumn()
  senderId?: string;

  @PrimaryColumn()
  recieverId?: string;

  @CreateDateColumn({ primary: true })
  date?: Date;

  @OneToMany(type => Message, message => message.conversation, { cascade: true })
  messages: Message[];

  @ManyToOne(type => User, user => user.sentConversations)
  @JoinColumn({ name: 'senderId' })
  sender?: User;

  @ManyToOne(type => User, user => user.recievedConversations)
  @JoinColumn({ name: 'recieverId' })
  reciever?: User;
}

@Entity('message')
export class Message extends BaseEntity {
  @Column({ length: 10000 })
  content: string;

  @ManyToOne(type => Conversation, conversation => conversation.messages)
  conversation?: Conversation;
}

В этом хранилище вы сможетечтобы воспроизвести ошибку: https://github.com/youtix/nest-typerorm-test

1 Ответ

0 голосов
/ 26 октября 2019

Ограничение внешнего ключа на ваших таблицах базы данных. Каскад в терминах RDBMS означает, что он будет распространяться через все отношения. Я полагаю, что ваш adminID при создании не является пользователем в вашей пользовательской таблице. Сначала необходимо запросить этого пользователя, а затем использовать его для отправки сообщения. Это должно решить вашу проблему, человек.

  1. Выбрать * от пользователя, где uname = 'admin'
  2. Вставить в таблицу сообщений, где userId = (userId from 1)

  3. праздновать

...