首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeORM STI继承问题

TypeORM STI继承问题
EN

Stack Overflow用户
提问于 2019-02-11 19:13:22
回答 2查看 1K关注 0票数 2

我正在尝试设置一个STI继承层次结构,类似于官方文档here中所描述的,但得到了以下错误

代码语言:javascript
复制
TypeError: Cannot read property 'ownColumns' of undefined
    at /Users/luizrolim/workspace/nqa/src/metadata-builder/EntityMetadataBuilder.ts:320:64
    at Array.map (<anonymous>)
    at EntityMetadataBuilder.computeEntityMetadataStep1 (/Users/luizrolim/workspace/nqa/src/metadata-builder/EntityMetadataBuilder.ts:316:14)
    at /Users/luizrolim/workspace/nqa/src/metadata-builder/EntityMetadataBuilder.ts:108:45
    at Array.forEach (<anonymous>)

以下是me实体:

代码语言:javascript
复制
@ChildEntity()
export class ChildExam extends BaseExam {

}


@Entity('exm_exams')
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class BaseExam extends NQBaseEntity {

  @Column()
  public alias: string

  @Column()
  public description: string

}

import { BaseEntity, Column, PrimaryGeneratedColumn } from 'typeorm'
import { DateColumns } from '@infra/util/db/DateColumns'

export abstract class NQBaseEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number

  @Column(type => DateColumns)
  public dates: DateColumns
}

我在运行"typeorm":"^0.2.12",

EN

回答 2

Stack Overflow用户

发布于 2020-11-07 21:32:46

在尝试让Single Table Inheritance正常工作时,我也遇到了这个错误:

(节点:22416) UnhandledPromiseRejectionWarning: TypeError:无法读取在metadata-builder\EntityMetadataBuilder.ts:356:64未定义的属性“”ownColumns“”

我的问题是,我只在connection options中列出了我的子实体,但是我忘了添加我的父实体。

下面是我解决这个问题的方法(使用TypeORM v0.3.0-rc.19):

ParentEntity.ts

代码语言:javascript
复制
import {BaseEntity, Entity} from 'typeorm';

@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class ParentEntity extends BaseEntity {
  // ...
}

ChildEntity.ts

代码语言:javascript
复制
import {ChildEntity} from 'typeorm';

@ChildEntity()
export class ChildEntity extends ParentEntity {
  constructor() {
    super();
  }

  // ...
}

initDatabase.ts

代码语言:javascript
复制
import 'reflect-metadata';
import {Connection, createConnection} from 'typeorm';
import {SqliteConnectionOptions} from 'typeorm/driver/sqlite/SqliteConnectionOptions';
import {PostgresConnectionOptions} from 'typeorm/driver/postgres/PostgresConnectionOptions';
import {ConnectionOptions} from 'typeorm/connection/ConnectionOptions';
import {ParentEntity, ChildEntity} from './entity/index';

function getConnectionOptions(env?: string): ConnectionOptions {
  // Here is the important part! Listing both, parent and child entity!
  const entities = [ParentEntity, ChildEntity];

  const test: SqliteConnectionOptions = {
    database: ':memory:',
    dropSchema: true,
    entities,
    logging: false,
    name: 'default',
    synchronize: true,
    type: 'sqlite',
  };

  const development: SqliteConnectionOptions = {
    database: 'test.db3',
    type: 'sqlite',
  };

  const production: PostgresConnectionOptions = {
    type: 'postgres',
    url: process.env.DATABASE_URL,
  };

  const devProd = {
    name: 'default',
    entities,
    logging: false,
    migrations: [],
    subscribers: [],
    synchronize: true,
  };

  switch (env) {
    case 'production':
      return Object.assign(production, devProd);
    case 'test':
      return test;
    default:
      return Object.assign(development, devProd);
  }
}

export default function initDatabase(): Promise<Connection> {
  const options = getConnectionOptions(process.env.NODE_ENV);
  return createConnection(options);
}

在我的应用程序中,我必须首先调用await initDatabase(),以便正确地初始化数据库模式。

票数 1
EN

Stack Overflow用户

发布于 2019-06-11 19:55:17

您应该使类BaseExam不是抽象的,才能使其工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54629321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档