Skip to content

JPM-14938 - Address ClassTable bug with duplicate inherited interface indexes.#488

Draft
Devereux-Henley wants to merge 2 commits into
master-servicetitanfrom
dehenley/JPM-14938-classtable-multi-path-interface
Draft

JPM-14938 - Address ClassTable bug with duplicate inherited interface indexes.#488
Devereux-Henley wants to merge 2 commits into
master-servicetitanfrom
dehenley/JPM-14938-classtable-multi-path-interface

Conversation

@Devereux-Henley
Copy link
Copy Markdown

No description provided.

Devereux-Henley and others added 2 commits May 15, 2026 11:54
BuildClassTableIndexes' inherited-interface dedup guard compares
type.Indexes against the interfaceIndex reference itself:

    if (type.Indexes.Any(i => i.DeclaringIndex == interfaceIndex)) continue;

When a type sits in DirectInterfaces via more than one path (e.g. a hierarchy
root implements IBusinessEntity both directly via a base class and transitively
via a sub-interface like INamedBusinessEntity), each path contributes a
distinct IndexInfo for the same logical interface index. The identity check
misses the second visit, BuildInheritedIndex runs again and produces an index
with the same name, and NodeCollection.Add throws "Item with name
'<Type>.<Interface>.FK_<Field>' already exists in '<Type>.Indexes'" — the
hierarchy fails to build.

Sibling BuildConcreteTableIndexes already handles this with a name-based check
after BuildInheritedIndex (and disposes the surplus IndexInfo). Mirror that
pattern here. Also dispose the index in the IndexBuiltOverInheritedFields
branch, which previously leaked the unused IndexInfo.

BuildSingleTableIndexes is unaffected — it dedups against
interfaceIndex.DeclaringIndex (chain-normalized identity).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tion

Regression test for the previous commit. Repros the case where a type
implements the same persistent interface through two paths in DirectInterfaces
(here: Root implements IOwned directly via OwnedBase AND transitively via
NamedOwnedBase → INamedAndOwned : IOwned). Before the fix, Domain.Build threw
"Item with name 'Root.IOwned.FK_Owner' already exists in 'Root.Indexes'" out
of IndexBuilder.BuildClassTableIndexes. With the fix it builds cleanly.

Mirrors the conventions in IndexesAndInheritanceSchemaTest.cs (nested *TestModel
namespace, DomainConfigurationFactory.Create, namespace-scoped Types.Register).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant