{"record":{"id":"344f9171d67d97bc","repo":"dotnet/efcore","slug":"the-indexes-index1-on-entitytype1-and-index-344f91","errorCode":null,"errorMessage":"The indexes {index1} on '{entityType1}' and {index2} on '{entityType2}' are both mapped to '{table}.{indexName}', but with different uniqueness configurations.","messagePattern":"The indexes (.+?) on '(.+?)' and (.+?) on '(.+?)' are both mapped to '(.+?)\\.(.+?)', but with different uniqueness configurations\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs","lineNumber":85,"sourceCode":"        if (!columnNames.SequenceEqual(duplicateColumnNames))\n        {\n            return shouldThrow\n                ? throw new InvalidOperationException(\n                    RelationalStrings.DuplicateIndexColumnMismatch(\n                        index.DisplayName(),\n                        index.DeclaringEntityType.DisplayName(),\n                        duplicateIndex.DisplayName(),\n                        duplicateIndex.DeclaringEntityType.DisplayName(),\n                        index.DeclaringEntityType.GetSchemaQualifiedTableName(),\n                        index.GetDatabaseName(storeObject),\n                        FormatColumnNames(columnNames),\n                        FormatColumnNames(duplicateColumnNames)))\n                : false;\n        }\n\n        return index.IsUnique != duplicateIndex.IsUnique\n            ? shouldThrow\n                ? throw new InvalidOperationException(\n                    RelationalStrings.DuplicateIndexUniquenessMismatch(\n                        index.DisplayName(),\n                        index.DeclaringEntityType.DisplayName(),\n                        duplicateIndex.DisplayName(),\n                        duplicateIndex.DeclaringEntityType.DisplayName(),\n                        index.DeclaringEntityType.GetSchemaQualifiedTableName(),\n                        index.GetDatabaseName(storeObject)))\n                : false\n            : (index.IsDescending is null) != (duplicateIndex.IsDescending is null)\n            || (index.IsDescending is not null\n                && duplicateIndex.IsDescending is not null\n                && !index.IsDescending.SequenceEqual(duplicateIndex.IsDescending))\n                ? shouldThrow\n                    ? throw new InvalidOperationException(\n                        RelationalStrings.DuplicateIndexSortOrdersMismatch(\n                            index.DisplayName(),\n                            index.DeclaringEntityType.DisplayName(),\n                            duplicateIndex.DisplayName(),","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/dotnet/efcore/blob/3a2006ef569de08368d59db5e1468aa8f407e4f8/src/EFCore.Relational/Metadata/Internal/RelationalIndexExtensions.cs#L67-L103","documentation":"Two indexes share the same database name and table but one is unique and the other is not. Uniqueness is a fundamental index property and cannot differ for a single database object.","triggerScenarios":"RelationalIndexExtensions.AreCompatible with shouldThrow:true when index.IsUnique != duplicateIndex.IsUnique. Commonly from table-splitting where one entity declares a unique index and another declares a non-unique index under the same name on the shared table.","commonSituations":"Owner declares IsUnique(false) and an owned/partner entity declares IsUnique(true) under a colliding name; copy/paste of HasDatabaseName after toggling uniqueness; legacy index conventions interacting with new unique indexes.","solutions":["Decide whether the index should be unique and set both definitions to match.","Give the indexes distinct database names via HasDatabaseName.","Remove the conflicting index.","Move one entity to its own table so the indexes no longer collide."],"exampleFix":"// before\nmodelBuilder.Entity<User>().HasIndex(u => u.Email).IsUnique().HasDatabaseName(\"IX_User_Email\");\nmodelBuilder.Entity<UserAudit>().ToTable(\"User\").HasIndex(u => u.Email).HasDatabaseName(\"IX_User_Email\");\n\n// after: align uniqueness or rename\nmodelBuilder.Entity<UserAudit>().ToTable(\"User\").HasIndex(u => u.Email).IsUnique().HasDatabaseName(\"IX_User_Email\");","handlingStrategy":"validation","validationCode":"// Detect uniqueness mismatch for colliding index names on the same table.\nvar groups = modelBuilder.Model.GetEntityTypes()\n    .SelectMany(e => e.GetDeclaredIndexes())\n    .GroupBy(i => new { Name = i.GetDatabaseName(), Table = i.DeclaringEntityType.GetSchemaQualifiedTableName() })\n    .Where(g => g.Count() > 1);\nforeach (var g in groups)\n{\n    if (g.Select(i => i.IsUnique).Distinct().Count() > 1)\n        Console.WriteLine($\"Index '{g.Key.Name}' on '{g.Key.Table}' has conflicting uniqueness.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Decide index uniqueness deliberately and apply it consistently to all indexes that may share a name.","Run a model-validation test in CI to surface uniqueness conflicts early."],"tags":["ef-core","relational-metadata","index","uniqueness","model-validation"],"backgroundTag":null,"analyzedSha":"3a2006ef569de08368d59db5e1468aa8f407e4f8","analyzedAt":"2026-08-11T23:42:04.146Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}