typescript 是否可以在TypeOrm中创建一个没有主键的表?

q1qsirdb  于 2023-05-19  发布在  TypeScript
关注(0)|答案(2)|浏览(216)

并且仍然设法在另一个实体中执行@OneToMany。

export class ProductsOfOrder { 
    @ManyToOne(() => Order, order => order.products)
    order: Order

    @ManyToOne(() => Product)
    product: Product

    @Column({type: 'integer'})
    amount: number
}

在使用顺序的外键的情况下

@Entity()
export class Order {
    @PrimaryGeneratedColumn('uuid')
    id: string

    @ManyToOne(() => User)
    user: User

    @OneToMany(() => ProductsOfOrder, productsOfOrder => productsOfOrder.order, {cascade: true})
    products: ProductsOfOrder[]
}
nqwrtyyt

nqwrtyyt1#

Ciao,不,你不能,因为它要求实体有一个主列,因为大多数ORM操作严重依赖于实体主ID。

llew8vvj

llew8vvj2#

当然,你可以在TypeORM中创建一个没有主键的表。
这里有一个很好的肮脏的小黑客:
1.向模型中添加一个伪主列,并将insert、select和update选项设置为false。

@Entity()
export class EntityWithoutPK {
  /**
  * ! This is a fake attribute
  * This is a workaround for TypeORM's `MissingPrimaryColumnError`
  **/
  @PrimaryColumn({ type: 'uuid', insert: false, select: false, update: false })
  id: never;

  // Other column definitions
}

1.生成一个迁移文件,然后从生成的SQL中删除主列部分
1.将synchronize选项设置为false

@Entity({ synchronize: false })
export class Order

1.运行迁移

备注

在应用黑客之前,请参阅以下清单。如果您对其中任何一个选择“否”,请创建一个主键。
1.您将只在组中查询,即通常与where条件一起使用另一个索引/FK列
1.单个实体没有意义,你永远不会调用一个方法(例如保存)
1.主键对于单个记录占用相当大的空间(例如,对于简单指标,UUID主键)。
1.实体模式不经常改变;否则,synchronize: false选项可能会导致大量的恐慌。
对于您的情况,在订单表中创建主键是非常有意义的。

相关问题