From 67806cb8ff79ae312295e615533ebec399823579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Sat, 12 Mar 2022 18:17:52 +0100 Subject: [PATCH] fix(mysql): mark FK columns as unsigned for mixed composite PKs Closes #2844 --- .../core/src/metadata/MetadataDiscovery.ts | 3 +- .../features/schema-generator/GH2844.test.ts | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tests/features/schema-generator/GH2844.test.ts diff --git a/packages/core/src/metadata/MetadataDiscovery.ts b/packages/core/src/metadata/MetadataDiscovery.ts index 593c0d176e17..6c6145cad38e 100644 --- a/packages/core/src/metadata/MetadataDiscovery.ts +++ b/packages/core/src/metadata/MetadataDiscovery.ts @@ -998,7 +998,8 @@ export class MetadataDiscovery { meta2.primaryKeys.forEach(primaryKey => { const pk = meta2.properties[primaryKey]; - prop.unsigned = this.platform.supportsUnsigned() && this.isNumericProperty(pk); + // if at least one of the target columns is unsigned, we need to mark the property as unsigned + prop.unsigned ||= this.platform.supportsUnsigned() && this.isNumericProperty(pk); }); return; diff --git a/tests/features/schema-generator/GH2844.test.ts b/tests/features/schema-generator/GH2844.test.ts new file mode 100644 index 000000000000..f9693ca74528 --- /dev/null +++ b/tests/features/schema-generator/GH2844.test.ts @@ -0,0 +1,68 @@ +import { Entity, Index, ManyToOne, MikroORM, OneToOne, PrimaryKey, Property } from '@mikro-orm/core'; + +@Entity() +export class UserAction { + + @PrimaryKey() + idUserAction!: string; + + @Property() + name!: string; + +} + +@Entity() +@Index({ properties: ['id', 'userAction'] }) +export class Step { + + @PrimaryKey() + id!: number; + + @ManyToOne({ primary: true, onDelete: 'cascade' }) + userAction!: UserAction; + +} + +@Entity() +export class Component { + + @PrimaryKey() + idComponent!: string; + + @ManyToOne({ onDelete: 'cascade' }) + step!: Step; + + @OneToOne({ + nullable: true, + fieldName: 'resultComponentId', + unique: false, + entity: () => Component, + }) + resultComponent?: Component; + +} + +describe('complex FKs in mariadb (GH 2844)', () => { + + let orm: MikroORM; + + beforeAll(async () => { + orm = await MikroORM.init({ + entities: [Component, Step, UserAction], + dbName: `mikro_orm_test_gh_2844`, + type: 'mariadb', + port: 3309, + }); + await orm.getSchemaGenerator().ensureDatabase(); + await orm.getSchemaGenerator().dropSchema(); + }); + + afterAll(() => orm.close(true)); + + test('schema generator adds the m:1 columns and FK properly', async () => { + const sql = await orm.getSchemaGenerator().getCreateSchemaSQL(); + expect(sql).toMatchSnapshot(); + await orm.getSchemaGenerator().execute(sql); + }); + +});