diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs new file mode 100644 index 00000000000..cb0f1e2cd1a --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs @@ -0,0 +1,26 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH2099 +{ + abstract class PersistentObject + { + public virtual Guid Id { get; set; } + public virtual bool PDO_Deleted { get; set; } + } + + class WorkflowInstance : PersistentObject + { + public virtual bool IsWaiting { get; set; } + } + + class Level3 : WorkflowInstance + { + public virtual bool IsActive { get; set; } + } + + class WorkflowInstance2 : PersistentObject + { + public virtual bool IsActive { get; set; } + public virtual bool IsWaiting { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs new file mode 100644 index 00000000000..d2ac2c46bb8 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs @@ -0,0 +1,27 @@ +using System.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH2099 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + } + + protected override void OnTearDown() + { + } + + [Test] + public void BaseClassCanShareIndexNameWithSubclass() + { + var table = cfg.CreateMappings().IterateTables.FirstOrDefault(t => t.Name == "Level3"); + + var index = table.GetIndex("CF_BASE_IDX"); + Assert.That(index?.ColumnSpan, Is.EqualTo(3)); + Assert.That(index.ColumnIterator.FirstOrDefault(c => c.Name == "PDO_Deleted"), Is.Not.Null); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml new file mode 100644 index 00000000000..128242e2aee --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate/Mapping/DenormalizedTable.cs b/src/NHibernate/Mapping/DenormalizedTable.cs index 24e2a14c5ab..bfb814e2858 100644 --- a/src/NHibernate/Mapping/DenormalizedTable.cs +++ b/src/NHibernate/Mapping/DenormalizedTable.cs @@ -43,8 +43,16 @@ public override IEnumerable IndexIterator IEnumerable includedIdxs = includedTable.IndexIterator; foreach (Index parentIndex in includedIdxs) { + var sharedIndex = GetIndex(parentIndex.Name); + if (sharedIndex != null) + { + sharedIndex.AddColumns(parentIndex.ColumnIterator); + sharedIndex.IsInherited = true; + continue; + } Index index = new Index(); - index.Name = Name + parentIndex.Name; + index.Name = parentIndex.Name; + index.IsInherited = true; index.Table = this; index.AddColumns(parentIndex.ColumnIterator); indexes.Add(index); diff --git a/src/NHibernate/Mapping/Index.cs b/src/NHibernate/Mapping/Index.cs index 74729189c9b..a29ec92152a 100644 --- a/src/NHibernate/Mapping/Index.cs +++ b/src/NHibernate/Mapping/Index.cs @@ -68,7 +68,8 @@ public static string BuildSqlDropIndexString(Dialect.Dialect dialect, Table tabl /// public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema) { - return BuildSqlCreateIndexString(dialect, Name, Table, ColumnIterator, false, defaultCatalog, defaultSchema); + var indexName = IsInherited ? Table.Name + Name : Name; + return BuildSqlCreateIndexString(dialect, indexName, Table, ColumnIterator, false, defaultCatalog, defaultSchema); } /// @@ -144,6 +145,11 @@ public string Name set { name = value; } } + /// + /// Is this index inherited from the base class mapping + /// + public bool IsInherited { get; set; } + public bool ContainsColumn(Column column) { return columns.Contains(column);