{"record":{"id":"f5edc9ae1b03ef50","repo":"weaviate/weaviate","slug":"invalid-reference-cannot-reference-a-multi-tenant","errorCode":null,"errorMessage":"invalid reference: cannot reference a multi-tenant enabled class from a non multi-tenant enabled class","messagePattern":"invalid reference: cannot reference a multi-tenant enabled class from a non multi-tenant enabled class","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"usecases/objects/batch_references_add.go","lineNumber":321,"sourceCode":"\tprincipal *models.Principal, schemaManager schemaManager,\n\trepo VectorRepo, source *crossref.RefSource, target *crossref.Ref,\n\ttenant string, fetchedClasses map[string]versioned.Class,\n) (uint64, error) {\n\tif source == nil || target == nil {\n\t\treturn 0, fmt.Errorf(\"can't validate multi-tenancy for nil refs\")\n\t}\n\n\tsourceClass, targetClass, schemaVersion, err := getReferenceClasses(\n\t\tctx, principal, schemaManager, source.Class.String(), source.Property.String(), target.Class, fetchedClasses)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tsourceEnabled := schema.MultiTenancyEnabled(sourceClass)\n\ttargetEnabled := schema.MultiTenancyEnabled(targetClass)\n\n\tif !sourceEnabled && targetEnabled {\n\t\treturn 0, fmt.Errorf(\"invalid reference: cannot reference a multi-tenant \" +\n\t\t\t\"enabled class from a non multi-tenant enabled class\")\n\t}\n\tif sourceEnabled && !targetEnabled {\n\t\tif err := validateTenantRefObject(ctx, repo, sourceClass, source.TargetID, tenant); err != nil {\n\t\t\treturn 0, fmt.Errorf(\"source: %w\", err)\n\t\t}\n\t\tif err := validateTenantRefObject(ctx, repo, targetClass, target.TargetID, \"\"); err != nil {\n\t\t\treturn 0, fmt.Errorf(\"target: %w\", err)\n\t\t}\n\t}\n\t// if both classes have MT enabled but different tenant keys,\n\t// no cross-tenant references can be made\n\tif sourceEnabled && targetEnabled {\n\t\tif err := validateTenantRefObject(ctx, repo, sourceClass, source.TargetID, tenant); err != nil {\n\t\t\treturn 0, fmt.Errorf(\"source: %w\", err)\n\t\t}\n\t\tif err := validateTenantRefObject(ctx, repo, targetClass, target.TargetID, tenant); err != nil {\n\t\t\treturn 0, fmt.Errorf(\"target: %w\", err)","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/objects/batch_references_add.go#L303-L339","documentation":"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.","triggerScenarios":"Thrown at usecases/objects/batch_references_add.go:321 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Enable multi-tenancy on the source class","Point the reference at a non-MT target class instead"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}