TypeOrm不同步JoinTable

时间:2019-08-07 19:49:33

标签: node.js typeorm

我目前正在研究两个模式。一个是由TypeOrm创建和管理的,另一个是xenforo实例。我仅对xenforo模式具有查询权限。每个用户的订阅都保存在不同的表中,该表需要与该用户联接。这是通过再次由xenforo管理的连接表完成的,因此我对此只有读取权限。因此,我设置了装饰,一切正常。但是,尽管该实体被标记为非同步,但TypeOrm尝试在xenforo模式中创建JoinTable,这由于缺少权限而失败。 这是我的实体类的样子:

@ObjectType()
@Entity({ schema: 'dev_xf', name: 'xf_user', synchronize: false })
export class User extends BaseEntity {
  @Field(type => Int)
  @PrimaryGeneratedColumn({ name: 'user_id', unsigned: true })
  id: number;

  @Field()
  @Column()
  username: string;

  @Column({ name: 'is_moderator' })
  isModerator: boolean;

  @Column({ name: 'is_admin' })
  isAdmin: boolean;

  @Field()
  @Column({ name: 'is_banned' })
  isBanned: boolean;

  @OneToOne(type => UserAuthentication)
  @JoinColumn({ name: 'user_id' })
  authentication: UserAuthentication;

  @Field(type => [UserUpgrade])
  @ManyToMany(type => UserUpgrade)
  @JoinTable({
    schema: 'dev_xf',
    name: 'xf_user_upgrade_active',
    joinColumn: {
      name: 'user_id'
    },
    inverseJoinColumn: {
      name: 'user_upgrade_id'
    }
  })
  userUpgrades: Promise<UserUpgrade[]>;
}
@ObjectType()
@Entity({ schema: 'dev_xf', name: 'xf_user_upgrade', synchronize: false })
export class UserUpgrade extends BaseEntity {
  @Field(type => Int)
  @PrimaryGeneratedColumn({ name: 'user_upgrade_id', unsigned: true })
  id: number;

  @Field()
  @Column()
  title: string;
}

有解决方法,尽管两个实体都标记为非同步,但TypeOrm试图创建JoinTable吗?

关于阿图尔

1 个答案:

答案 0 :(得分:1)

编辑: 好的,我找不到找到这项工作的方法。似乎需要实现该功能:https://github.com/typeorm/typeorm/issues/3443#issuecomment-455479721

原始答案: 如果使用两个模式,那么ormconfig中应该有两个连接。当您将实体拆分到不同的文件夹(由数据库分隔)时,迁移仅针对该文件夹中的实体执行。

示例: 您的文件夹结构应如下所示:

+-- src
    +-- entity
       +-- default
          +-- YourEntity.ts
       +-- external
          +-- User.ts
          +-- UserUpgrade.ts

您的ormconfig应该看起来像这样(不同的实体文件夹)

{
    "name": "default",
    "database": "default",
    "type": "mariadb",
    "entities": [
      "src/entity/default/**/*.ts"
    ],
    ...
},
{
    "name": "external",
    "database": "dev_xf",
    "type": "mariadb",
    "entities": [
      "src/entity/external/**/*.ts"
    ],
    ...
}

现在运行迁移以连接YourDatabase时,您只需运行

typeorm migration:run -c default

,并且不会触摸外部文件夹中的实体。