如果一个关系具有复合键,则TypeORM创建具有ManyToMany关系错误的JoinTable

时间:2020-08-29 13:44:20

标签: typeorm

我有两个实体Channel和Member。它们与Channel一侧的连接表具有n-n关系。当我启动程序时,在新的空数据库上,与数据库的同步失败,输出为:

query: CREATE TABLE "channel" ("id" bigint NOT NULL, "name" character varying NOT NULL, "deleted" boolean NOT NULL DEFAULT false, "channelCreatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "guildId" bigint, CONSTRAINT "PK_590f33ee6ee7d76437acf362e39" PRIMARY KEY ("id"))
query: CREATE TABLE "member" ("displayName" character varying NOT NULL, "userId" bigint NOT NULL, "guildId" bigint NOT NULL, CONSTRAINT "PK_59e0756d90604968396baa9bbb5" PRIMARY KEY ("userId", "guildId"))
query: CREATE TABLE "join_channel_members" ("channelId" bigint NOT NULL, CONSTRAINT "PK_15add12594e72eb7e05795478dd" PRIMARY KEY ("channelId"))
query: CREATE INDEX "IDX_15add12594e72eb7e05795478d" ON "join_channel_members" ("channelId") // <--- Here only one part of the primary key is used for some reason. The table only contains one primary key of one side.
query: CREATE INDEX "IDX_f25ce186833bac5a83b477faa8" ON "join_channel_members" () 
query failed: CREATE INDEX "IDX_f25ce186833bac5a83b477faa8" ON "join_channel_members" () 
error: error: syntax error at or near ")"
    at Parser.parseErrorMessage (D:\Projekte\**projectcds**\backend\node_modules\pg-protocol\src\parser.ts:357:11)
    at Parser.handlePacket (D:\Projekte\**projectcds**\backend\node_modules\pg-protocol\src\parser.ts:186:21)
    at Parser.parse (D:\Projekte\**projectcds**\backend\node_modules\pg-protocol\src\parser.ts:101:30)
    at Socket.<anonymous> (D:\Projekte\**projectcds**\backend\node_modules\pg-protocol\src\index.ts:7:48)
    at Socket.emit (events.js:311:20)
    at addChunk (_stream_readable.js:294:12)
    at readableAddChunk (_stream_readable.js:275:11)
    at Socket.Readable.push (_stream_readable.js:209:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23) {
  length: 90,
  name: 'error',
  severity: 'ERROR',
  code: '42601',
  detail: undefined,
  hint: undefined,
  position: '79',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'scan.l',
  line: '1145',
  routine: 'scanner_yyerror'
}
query: ROLLBACK

由于某种原因,联接表不包含带有复合键的一侧的主键(成员)。该键的列也是其他实体的外键(主键始终称为“ id”)。如果我使用两个“普通”列,则效果很好。下面是这两个实体的代码(我删除了大多数不必要的属性)。

@Entity()
/**
 * Entity for all Channel Type Entitys
 */
export abstract class Channel {
  @PrimaryColumn({
    type: 'bigint',
  })
  id?: string;

  @Column()
  name?: string;

  // I added the JoinTable options just for testing. It does not work with and without them.
  @ManyToMany((type) => Member, (member: Member) => member.channels)
  @JoinTable({
    name: 'join_channel_guildmembers',
    joinColumns: [
      {name: 'channelId', referencedColumnName: 'id'},
    ],
    inverseJoinColumns: [
      {name: 'user', referencedColumnName: 'userId'},
      {name: 'guild', referencedColumnName: 'guildId'},
    ],
  })
  members?: Member[]
}

@Entity()
/**
 * Entity for Member.
 */
export class Member {
  // @PrimaryColumn({
  //   type: 'bigint',
  // })
  // id?: string;

  @ManyToOne((type) => User, (user:User) => user.members, {
    primary: true,
  })
  user?: User;

  // @PrimaryColumn({
  //   type: 'bigint',
  // })
  // guildId?: string;

  @ManyToOne((type) => Guild, (guild:Guild) => guild.members, {
    primary: true,
  })
  guild?: Guild;

  @Column()
  displayName?: string;

  @ManyToMany((type) => Channel, (channel: Channel) => channel.members)
  channels?: Channel[]
}

有没有办法使这种n-n关系起作用?我认为问题是,typeorm没有使用那些主键进行正确的连接。它只是忽略了它们。

我不知道它是否重要,但是从未使用过此通道实体。但是其他实体正在扩展这一实体(PrivateChannel,PublicChannel,TeamChannel)。

0 个答案:

没有答案