diff --git a/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/FixtureByCode.cs b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/FixtureByCode.cs new file mode 100644 index 00000000000..6f32fb85cdb --- /dev/null +++ b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/FixtureByCode.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Text; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Dialect; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.IntegrationTests.NH3527 +{ + [TestFixture] + public class FixtureByCode : TestCaseMappingByCode + { + [Test] + public void VerifyMapping() + { + var mapping = this.GetMappings(); + + // Item mapping. + mapping.UnionSubclasses[0].abstractSpecified.Should().Be.True(); + mapping.UnionSubclasses[0].@abstract.Should().Be.True(); + // InventoryItem mapping. + mapping.UnionSubclasses[1].abstractSpecified.Should().Be.False(); + mapping.UnionSubclasses[1].@abstract.Should().Be.False(); + } + + [Test] + public void VerifyTables() + { + using (var session = this.OpenSession()) + { + var tableNameColumnName = "TABLE_NAME"; + var itemTableName = "Item"; + var inventoryItemTableName = "InventoryItem"; + + var schema = this.Dialect.GetDataBaseSchema((DbConnection) session.Connection); + var tables = schema.GetTables(null, null, null, null).AsEnumerable(); + var itemTable = tables.SingleOrDefault( + x => string.Equals(x.Field(tableNameColumnName), + itemTableName, + StringComparison.InvariantCultureIgnoreCase)); + var inventoryItemTable = tables.SingleOrDefault( + x => string.Equals(x.Field(tableNameColumnName), + inventoryItemTableName, + StringComparison.InvariantCultureIgnoreCase)); + + itemTable.Should().Be.Null(); + inventoryItemTable.Should().Not.Be.Null(); + } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2008Dialect; + } + + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.Class( + m => m.Id(x => x.Id, im => im.Generator(Generators.HighLow))); + mapper.UnionSubclass(m => { }); + mapper.UnionSubclass(m => { }); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + } +} diff --git a/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/Model.cs b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/Model.cs new file mode 100644 index 00000000000..63ef75cc75e --- /dev/null +++ b/src/NHibernate.Test/MappingByCode/IntegrationTests/NH3527/Model.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.MappingByCode.IntegrationTests.NH3527 +{ + public abstract class EntityBase + { + public virtual int Id { get; set; } + } + + public abstract class Item : EntityBase + { + } + + public class InventoryItem : Item + { + } +} diff --git a/src/NHibernate.Test/MappingByCode/MappersTests/UnionSubclassMapperTests/AbstractAttributeTests.cs b/src/NHibernate.Test/MappingByCode/MappersTests/UnionSubclassMapperTests/AbstractAttributeTests.cs new file mode 100644 index 00000000000..9a128e5fb31 --- /dev/null +++ b/src/NHibernate.Test/MappingByCode/MappersTests/UnionSubclassMapperTests/AbstractAttributeTests.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.UnionSubclassMapperTests +{ + [TestFixture] + public class AbstractAttributeTests + { + private abstract class EntityBase + { + } + + private abstract class Item : EntityBase + { + } + + private class InventoryItem : Item + { + } + + [Test] + public void CanSetAbstractAttributeOnAbstractClass() + { + var mapping = new HbmMapping(); + var mapper = new UnionSubclassMapper(typeof(Item), mapping); + + mapping.UnionSubclasses[0].abstractSpecified.Should().Be.True(); + mapping.UnionSubclasses[0].@abstract.Should().Be.True(); + } + + [Test] + public void CanSetAbstractAttributeOnConcreteClass() + { + var mapping = new HbmMapping(); + var mapper = new UnionSubclassMapper(typeof(InventoryItem), mapping); + + mapping.UnionSubclasses[0].abstractSpecified.Should().Be.False(); + mapping.UnionSubclasses[0].@abstract.Should().Be.False(); + } + } +} diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index e9367d71425..3398e821ec4 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -90,6 +90,7 @@ 3.5 + @@ -589,6 +590,10 @@ + + + + @@ -625,6 +630,7 @@ + diff --git a/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs index 2ad3b266d29..630acaa5691 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs @@ -17,6 +17,11 @@ public UnionSubclassMapper(System.Type subClass, HbmMapping mapDoc) var toAdd = new[] {classMapping}; classMapping.name = subClass.GetShortClassName(mapDoc); classMapping.extends = subClass.BaseType.GetShortClassName(mapDoc); + if (subClass.IsAbstract) + { + classMapping.@abstract = true; + classMapping.abstractSpecified = true; + } mapDoc.Items = mapDoc.Items == null ? toAdd : mapDoc.Items.Concat(toAdd).ToArray(); }