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
- Enable multi-tenancy on the source class
- 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.