#javascript #typescript #typeorm #single-table-inheritance
Вопрос:
Я безуспешно пытался добиться наследования одной таблицы с помощью typeorm, используя определения схем. Мои сущности имеют иерархию с абстрактным участником базового класса и хотели бы использовать свойство перечисления, названное type
в качестве дискриминатора.
Дискриминатор перечисления
export enum AttendeeType {
Member = 'member',
Guest = 'guest',
}
Интерфейсы
export interface IAttendee extends IPrimaryKey {
type: AttendeeType;
_username?: string;
givenName: string;
familyName: string;
sessionToken: string;
isHost: boolean;
meeting: number;
}
export interface IGuest extends IAttendee {
test?: string; //this is to work around empty columns not being allowed in schema definitions
}
export interface IMember extends IAttendee {
_username?: string;
}
Определения схем
export const AttendeeSchema = new EntitySchema<IAttendee>({
name: 'attendees',
target: Attendee, //tried setting targets explicitly to get inheritance
columns: {
...primaryKeySchema,
type: { //no way to indicate this is the discriminator
type: 'enum',
enum: AttendeeType,
nullable: false,
default: AttendeeType.Guest,
},
givenName: {
type: 'varchar',
name: 'name_givenName',
length: 50,
nullable: false,
},
familyName: {
type: 'varchar',
name: 'name_familyName',
length: 50,
nullable: false,
},
vonageSessionToken: {
type: 'varchar',
length: 500,
nullable: false,
},
isHost: {
type: 'boolean',
nullable: false,
default: false,
},
},
relations: {
meeting: {
type: 'many-to-one',
target: Meeting,
nullable: false,
joinColumn: true,
orphanedRowAction: 'delete',
},
},
});
export const GuestSchema = new EntitySchema<IGuest>({
name: 'guests',
target: Guest,
extends: 'attendees',
type: 'entity-child',
columns: {
test: { //trying to work around failure with empty columns definition
type: 'varchar',
length: 10,
nullable: true,
},
},
});
export const MemberSchema = new EntitySchema<IMember>({
name: 'members',
target: Member,
extends: 'attendees',
type: 'entity-child',
columns: {
_username: {
type: 'varchar',
name: 'username',
length: 36,
nullable: true,
},
},
});
Я попытался установить цели для реализаций класса сущностей, а также разрешить ему использовать имя по умолчанию. Установка типа схемы entity-child
в значение должно указывать на то, что это наследование одной таблицы, но иерархия наследования обнаружена неправильно.
Я должен быть в состоянии переключиться на подход декоратора, чтобы позволить мне продолжить, но я предпочитаю отделять свои модели предметной области от представления данных, используемого для сохранения и увлажнения.
Я отладил в EntitySchemaTransformer и EntityMetadatBuilder, но, к сожалению, не смог найти ничего, что привело бы меня к тому, как STI будет настроен с помощью определений схемы.