weaviate/weaviate · error

invalid reference: cannot reference a multi-tenant enabled c

Error message

invalid reference: cannot reference a multi-tenant enabled class from a non multi-tenant enabled class

What it means

Multi-tenancy consistency guard in validateReferenceMultiTenancy: the source class has multi-tenancy disabled while the target class has it enabled. Such cross references are invalid because the target object's tenant cannot be derived from a non-MT source.

Source

Thrown at usecases/objects/batch_references_add.go:321

	principal *models.Principal, schemaManager schemaManager,
	repo VectorRepo, source *crossref.RefSource, target *crossref.Ref,
	tenant string, fetchedClasses map[string]versioned.Class,
) (uint64, error) {
	if source == nil || target == nil {
		return 0, fmt.Errorf("can't validate multi-tenancy for nil refs")
	}

	sourceClass, targetClass, schemaVersion, err := getReferenceClasses(
		ctx, principal, schemaManager, source.Class.String(), source.Property.String(), target.Class, fetchedClasses)
	if err != nil {
		return 0, err
	}

	sourceEnabled := schema.MultiTenancyEnabled(sourceClass)
	targetEnabled := schema.MultiTenancyEnabled(targetClass)

	if !sourceEnabled && targetEnabled {
		return 0, fmt.Errorf("invalid reference: cannot reference a multi-tenant " +
			"enabled class from a non multi-tenant enabled class")
	}
	if sourceEnabled && !targetEnabled {
		if err := validateTenantRefObject(ctx, repo, sourceClass, source.TargetID, tenant); err != nil {
			return 0, fmt.Errorf("source: %w", err)
		}
		if err := validateTenantRefObject(ctx, repo, targetClass, target.TargetID, ""); err != nil {
			return 0, fmt.Errorf("target: %w", err)
		}
	}
	// if both classes have MT enabled but different tenant keys,
	// no cross-tenant references can be made
	if sourceEnabled && targetEnabled {
		if err := validateTenantRefObject(ctx, repo, sourceClass, source.TargetID, tenant); err != nil {
			return 0, fmt.Errorf("source: %w", err)
		}
		if err := validateTenantRefObject(ctx, repo, targetClass, target.TargetID, tenant); err != nil {
			return 0, fmt.Errorf("target: %w", err)

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Enable multi-tenancy on the source class
  2. Point the reference at a non-MT target class instead
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at usecases/objects/batch_references_add.go:321 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/f5edc9ae1b03ef50. Report an issue: GitHub.