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..f51aabe38eb
--- /dev/null
+++ b/src/NHibernate.Test/MappingByCode/MappersTests/UnionSubclassMapperTests/AbstractAttributeTests.cs
@@ -0,0 +1,42 @@
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+
+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);
+
+ Assert.That(mapping.UnionSubclasses[0].abstractSpecified, Is.True);
+ Assert.That(mapping.UnionSubclasses[0].@abstract, Is.True);
+ }
+
+ [Test]
+ public void CanSetAbstractAttributeOnConcreteClass()
+ {
+ var mapping = new HbmMapping();
+ var mapper = new UnionSubclassMapper(typeof(InventoryItem), mapping);
+
+ Assert.That(mapping.UnionSubclasses[0].abstractSpecified, Is.False);
+ Assert.That(mapping.UnionSubclasses[0].@abstract, Is.False);
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj
index c947c69218f..7264b73aab0 100644
--- a/src/NHibernate.Test/NHibernate.Test.csproj
+++ b/src/NHibernate.Test/NHibernate.Test.csproj
@@ -676,6 +676,7 @@
+
diff --git a/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs
index 8d2fc1404a3..f4886ca8024 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();
}
@@ -170,7 +175,7 @@ public void Extends(System.Type baseType)
if (!Container.GetBaseTypes().Contains(baseType))
{
throw new ArgumentOutOfRangeException("baseType",
- string.Format("{0} is a valid super-class of {1}", baseType, Container));
+ string.Format("{0} is a valid super-class of {1}", baseType, Container));
}
classMapping.extends = baseType.GetShortClassName(MapDoc);
}