n8n-io/n8n · error · TypeORMError

Entity ${entityMetadata.name} has an undefined discriminator

Error message

Entity ${entityMetadata.name} has an undefined discriminator value. Discriminator value should be defined.

What it means

Thrown by EntityMetadataValidator.validate in the STI branch when a discriminator column exists but discriminatorValue is undefined. Each STI participant (root and every child) must declare its discriminator value via @DiscriminatorValue or the class name default; an undefined value means TypeORM cannot persist or hydrate the row correctly.

Source

Thrown at packages/@n8n/typeorm/src/metadata-builder/EntityMetadataValidator.ts:81

				throw new TypeORMError(
					`Entity ${entityMetadata.name} has multiple primary columns with different constraint names. Constraint names should be the equal.`,
				);
			}
		}

		// validate if table is using inheritance it has a discriminator
		// also validate if discriminator values are not empty and not repeated
		if (
			entityMetadata.inheritancePattern === 'STI' ||
			entityMetadata.tableType === 'entity-child'
		) {
			if (!entityMetadata.discriminatorColumn)
				throw new TypeORMError(
					`Entity ${entityMetadata.name} using single-table inheritance, it should also have a discriminator column. Did you forget to put discriminator column options?`,
				);

			if (typeof entityMetadata.discriminatorValue === 'undefined')
				throw new TypeORMError(
					`Entity ${entityMetadata.name} has an undefined discriminator value. Discriminator value should be defined.`,
				);

			const sameDiscriminatorValueEntityMetadata = allEntityMetadatas.find((metadata) => {
				return (
					metadata !== entityMetadata &&
					(metadata.inheritancePattern === 'STI' || metadata.tableType === 'entity-child') &&
					metadata.tableName === entityMetadata.tableName &&
					metadata.discriminatorValue === entityMetadata.discriminatorValue &&
					metadata.inheritanceTree.some(
						(parent) => entityMetadata.inheritanceTree.indexOf(parent) !== -1,
					)
				);
			});
			if (sameDiscriminatorValueEntityMetadata)
				throw new TypeORMError(
					`Entities ${entityMetadata.name} and ${sameDiscriminatorValueEntityMetadata.name} have the same discriminator values. Make sure they are different while using the @ChildEntity decorator.`,
				);

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Add @DiscriminatorValue('article') (or another unique literal) to each child entity.
  2. Ensure the root entity also has a discriminator value if it can be instantiated.
  3. Keep discriminator values unique across siblings (the next validator check enforces this).

Example fix

// before
@ChildEntity()
export class Article extends Content {}

// after
@ChildEntity()
@DiscriminatorValue('article')
export class Article extends Content {}
Defensive patterns

Strategy: validation

Validate before calling

function assertStiDiscriminatorValuesDefined(dataSource: DataSource): string[] {
  const problems: string[] = [];
  for (const meta of dataSource.entityMetadatas) {
    const isSti = meta.inheritancePattern === 'STI' || meta.tableType === 'entity-child';
    if (isSti && typeof meta.discriminatorValue === 'undefined') {
      problems.push(`${meta.targetName} has undefined discriminator value`);
    }
  }
  return problems;
}

Try / catch

try {
  await dataSource.initialize();
} catch (err) {
  if (err.message.includes('undefined discriminator value')) {
    // add @DiscriminatorValue to the offending child entity
  }
  throw err;
}

Prevention

When it happens

Trigger: Marking a @ChildEntity without @DiscriminatorValue (and no default derived from the class name), or declaring @DiscriminatorColumn without specifying values for subclasses.

Common situations: Adding a new child entity to an STI tree and forgetting its discriminator value; relying on default-name behavior that was changed by a refactor.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/726f2ea53e4a70b2. Report an issue: GitHub.