Skip to content

Commit 403923d

Browse files
committed
NH-3527 - UnionSubclassMapper should mark an abstract type as abstract in the generated HbmMapping
1 parent 837e182 commit 403923d

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using NHibernate.Cfg.MappingSchema;
2+
using NHibernate.Mapping.ByCode.Impl;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.MappingByCode.MappersTests.UnionSubclassMapperTests
6+
{
7+
[TestFixture]
8+
public class AbstractAttributeTests
9+
{
10+
private abstract class EntityBase
11+
{
12+
}
13+
14+
private abstract class Item : EntityBase
15+
{
16+
}
17+
18+
private class InventoryItem : Item
19+
{
20+
}
21+
22+
[Test]
23+
public void CanSetAbstractAttributeOnAbstractClass()
24+
{
25+
var mapping = new HbmMapping();
26+
var mapper = new UnionSubclassMapper(typeof(Item), mapping);
27+
28+
Assert.That(mapping.UnionSubclasses[0].abstractSpecified, Is.True);
29+
Assert.That(mapping.UnionSubclasses[0].@abstract, Is.True);
30+
}
31+
32+
[Test]
33+
public void CanSetAbstractAttributeOnConcreteClass()
34+
{
35+
var mapping = new HbmMapping();
36+
var mapper = new UnionSubclassMapper(typeof(InventoryItem), mapping);
37+
38+
Assert.That(mapping.UnionSubclasses[0].abstractSpecified, Is.False);
39+
Assert.That(mapping.UnionSubclasses[0].@abstract, Is.False);
40+
}
41+
}
42+
}

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,7 @@
676676
<Compile Include="MappingByCode\MappersTests\SubclassMapperTests\SetPersisterTests.cs" />
677677
<Compile Include="MappingByCode\MappersTests\SubclassMapperTests\TablesSincronizationTests.cs" />
678678
<Compile Include="MappingByCode\MappersTests\SubclassMapperWithJoinPropertiesTest.cs" />
679+
<Compile Include="MappingByCode\MappersTests\UnionSubclassMapperTests\AbstractAttributeTests.cs" />
679680
<Compile Include="MappingByCode\MappersTests\UnionSubclassMapperTests\SetPersisterTests.cs" />
680681
<Compile Include="MappingByCode\MappersTests\UnionSubclassMapperTests\TablesSincronizationTests.cs" />
681682
<Compile Include="MappingByCode\MixAutomapping\ArrayCollectionTests.cs" />

src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public UnionSubclassMapper(System.Type subClass, HbmMapping mapDoc)
1717
var toAdd = new[] {classMapping};
1818
classMapping.name = subClass.GetShortClassName(mapDoc);
1919
classMapping.extends = subClass.BaseType.GetShortClassName(mapDoc);
20+
if (subClass.IsAbstract)
21+
{
22+
classMapping.@abstract = true;
23+
classMapping.abstractSpecified = true;
24+
}
2025
mapDoc.Items = mapDoc.Items == null ? toAdd : mapDoc.Items.Concat(toAdd).ToArray();
2126
}
2227

@@ -170,7 +175,7 @@ public void Extends(System.Type baseType)
170175
if (!Container.GetBaseTypes().Contains(baseType))
171176
{
172177
throw new ArgumentOutOfRangeException("baseType",
173-
string.Format("{0} is a valid super-class of {1}", baseType, Container));
178+
string.Format("{0} is a valid super-class of {1}", baseType, Container));
174179
}
175180
classMapping.extends = baseType.GetShortClassName(MapDoc);
176181
}

0 commit comments

Comments
 (0)