diff --git a/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/BasicMappingOfSimpleClass.cs b/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/BasicMappingOfSimpleClass.cs index 78f681a286b..f667019f8e7 100644 --- a/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/BasicMappingOfSimpleClass.cs +++ b/src/NHibernate.Test/MappingByCode/ExplicitMappingTests/BasicMappingOfSimpleClass.cs @@ -6,7 +6,7 @@ using NHibernate.Mapping.ByCode; using NUnit.Framework; -namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +namespace NHibernate.Test.MappingByCode.ExplicitMappingTests { public class BasicMappingOfSimpleClass { @@ -16,6 +16,25 @@ public class MyClass public string Something { get; set; } } + [Test] + public void AbstractClass() + { + //NH-3527 + var mapper = new ModelMapper(); + mapper.Class(ca => + { + ca.Abstract(true); + ca.Id(x => x.Id, map => + { + map.Column("MyClassId"); + map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 })); + }); + ca.Property(x => x.Something, map => map.Length(150)); + }); + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + Assert.AreEqual(hbmMapping.RootClasses[0].@abstract, true); + } + [Test] public void MapClassWithIdAndProperty() { diff --git a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs index f0c3ad4e570..13b259f7f37 100644 --- a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs +++ b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs @@ -79,5 +79,23 @@ public void WhenRegisteredAsJoinedSubclassThenIsEntity() Assert.That(inspector.IsEntity(typeof(Inherited1)), Is.True); } + + [Test] + public void JoinedSubclassIsAbstract() + { + //NH-3527 + var modelMapper = new ModelMapper(); + modelMapper.Class(c => { }); + modelMapper.JoinedSubclass(c => + { + c.Abstract(true); + c.Extends(typeof(MyClass)); + }); + + var mappings = modelMapper.CompileMappingForAllExplicitlyAddedEntities(); + + Assert.IsTrue(mappings.JoinedSubclasses[0].@abstract); + Assert.IsTrue(mappings.JoinedSubclasses[0].extends == typeof(MyClass).FullName); + } } } \ No newline at end of file diff --git a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs index 718517bac60..0fcb759b941 100644 --- a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs +++ b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs @@ -79,5 +79,23 @@ public void WhenRegisteredAsSubclassThenIsEntity() Assert.That(inspector.IsEntity(typeof(Inherited1)), Is.True); } + + [Test] + public void SubclassIsAbstract() + { + //NH-3527 + var modelMapper = new ModelMapper(); + modelMapper.Class(c => { }); + modelMapper.Subclass(c => + { + c.Abstract(true); + c.Extends(typeof(MyClass)); + }); + + var mappings = modelMapper.CompileMappingForAllExplicitlyAddedEntities(); + + Assert.IsTrue(mappings.SubClasses[0].@abstract); + Assert.IsTrue(mappings.SubClasses[0].extends == typeof(MyClass).FullName); + } } } \ No newline at end of file diff --git a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs index f72fbe1e6e7..8a8e020f005 100644 --- a/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs +++ b/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs @@ -79,5 +79,23 @@ public void WhenRegisteredAsUnionSubclassThenIsEntity() Assert.That(inspector.IsEntity(typeof(Inherited1)), Is.True); } + + [Test] + public void UnionSubclassIsAbstract() + { + //NH-3527 + var modelMapper = new ModelMapper(); + modelMapper.Class(c => { }); + modelMapper.UnionSubclass(c => + { + c.Abstract(true); + c.Extends(typeof(MyClass)); + }); + + var mappings = modelMapper.CompileMappingForAllExplicitlyAddedEntities(); + + Assert.IsTrue(mappings.UnionSubclasses[0].@abstract); + Assert.IsTrue(mappings.UnionSubclasses[0].extends == typeof(MyClass).FullName); + } } } \ No newline at end of file diff --git a/src/NHibernate/Mapping/ByCode/IClassMapper.cs b/src/NHibernate/Mapping/ByCode/IClassMapper.cs index b472db56cc2..5e715cf1075 100644 --- a/src/NHibernate/Mapping/ByCode/IClassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/IClassMapper.cs @@ -13,6 +13,7 @@ public interface IClassAttributesMapper : IEntityAttributesMapper, IEntitySqlsMa void ComponentAsId(MemberInfo idProperty, Action idMapper); void ComposedId(Action idPropertiesMapping); + void Abstract(bool isAbstract); void Discriminator(Action discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); @@ -53,6 +54,7 @@ public interface IClassAttributesMapper : IEntityAttributesMapper, IEnt void ComposedId(Action> idPropertiesMapping); + void Abstract(bool isAbstract); void Discriminator(Action discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); diff --git a/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs index a68b38ec51c..1ba3e01d50b 100644 --- a/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/IJoinedSubclassMapper.cs @@ -10,13 +10,16 @@ public interface IJoinedSubclassAttributesMapper : IEntityAttributesMapper, IEnt void Key(Action keyMapping); void Extends(System.Type baseType); void SchemaAction(SchemaAction action); - void Filter(string filterName, Action filterMapping); + void Filter(string filterName, Action filterMapping); + void Abstract(bool isAbstract); } public interface IJoinedSubclassMapper : IJoinedSubclassAttributesMapper, IPropertyContainerMapper {} public interface IJoinedSubclassAttributesMapper : IEntityAttributesMapper, IEntitySqlsMapper where TEntity : class { + void Abstract(bool isAbstract); + void Extends(System.Type baseType); void Table(string tableName); void Catalog(string catalogName); void Schema(string schemaName); diff --git a/src/NHibernate/Mapping/ByCode/ISubclassMapper.cs b/src/NHibernate/Mapping/ByCode/ISubclassMapper.cs index 5c6b04dc578..14a336e7a5d 100644 --- a/src/NHibernate/Mapping/ByCode/ISubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/ISubclassMapper.cs @@ -7,6 +7,7 @@ public interface ISubclassAttributesMapper : IEntityAttributesMapper, IEntitySql void DiscriminatorValue(object value); void Extends(System.Type baseType); void Filter(string filterName, Action filterMapping); + void Abstract(bool isAbstract); } public interface ISubclassMapper : ISubclassAttributesMapper, IPropertyContainerMapper @@ -18,6 +19,8 @@ public interface ISubclassAttributesMapper : IEntityAttributesMapper, I { void DiscriminatorValue(object value); void Filter(string filterName, Action filterMapping); + void Extends(System.Type baseType); + void Abstract(bool isAbstract); } public interface ISubclassMapper : ISubclassAttributesMapper, IPropertyContainerMapper where TEntity : class diff --git a/src/NHibernate/Mapping/ByCode/IUnionSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/IUnionSubclassMapper.cs index 764757fefed..0ddfb9adef4 100644 --- a/src/NHibernate/Mapping/ByCode/IUnionSubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/IUnionSubclassMapper.cs @@ -6,6 +6,7 @@ public interface IUnionSubclassAttributesMapper : IEntityAttributesMapper, IEnti void Catalog(string catalogName); void Schema(string schemaName); void Extends(System.Type baseType); + void Abstract(bool isAbstract); } public interface IUnionSubclassMapper : IUnionSubclassAttributesMapper, IPropertyContainerMapper {} @@ -15,6 +16,8 @@ public interface IUnionSubclassAttributesMapper : IEntityAttributesMapp void Table(string tableName); void Catalog(string catalogName); void Schema(string schemaName); + void Extends(System.Type baseType); + void Abstract(bool isAbstract); } public interface IUnionSubclassMapper : IUnionSubclassAttributesMapper, IPropertyContainerMapper where TEntity : class {} diff --git a/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs index 2bfc5cdf439..554420f46a3 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs @@ -59,6 +59,12 @@ public Dictionary JoinMappers } #region Implementation of IClassMapper + public void Abstract(bool isAbstract) + { + classMapping.@abstract = isAbstract; + classMapping.abstractSpecified = true; + } + public void OptimisticLock(OptimisticLockMode mode) { classMapping.optimisticlock = (HbmOptimisticLockMode)Enum.Parse(typeof(OptimisticLockMode), mode.ToString()); diff --git a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs index 1393718a565..d2de6bdf921 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs @@ -29,6 +29,10 @@ private Dictionary> JoinCustomizers } #region Implementation of IClassAttributesMapper + public void Abstract(bool isAbstract) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Abstract(isAbstract)); + } public void OptimisticLock(OptimisticLockMode mode) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs index 6d49e6557c4..34d74844c53 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs @@ -111,6 +111,15 @@ public void Subselect(string sql) #endregion #region Implementation of IJoinedSubclassAttributesMapper + public void Extends(System.Type baseType) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => m.Extends(baseType)); + } + + public void Abstract(bool isAbstract) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => m.Abstract(isAbstract)); + } public void Table(string tableName) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs index 1b94efd7793..0f5e4ef58a0 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs @@ -22,6 +22,15 @@ public SubclassCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsH } #region ISubclassMapper Members + public void Extends(System.Type baseType) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => m.Extends(baseType)); + } + + public void Abstract(bool isAbstract) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => m.Abstract(isAbstract)); + } public void DiscriminatorValue(object value) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs index e4c0751c1e2..6b20cdd69cb 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs @@ -97,6 +97,15 @@ public void Subselect(string sql) #endregion #region Implementation of IUnionSubclassAttributesMapper + public void Extends(System.Type baseType) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => m.Extends(baseType)); + } + + public void Abstract(bool isAbstract) + { + CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => m.Abstract(isAbstract)); + } public void Table(string tableName) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/JoinedSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/JoinedSubclassMapper.cs index f6871711496..e096329a30a 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/JoinedSubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/JoinedSubclassMapper.cs @@ -149,6 +149,11 @@ public void Subselect(string sql) #endregion #region Implementation of IJoinedSubclassAttributesMapper + public void Abstract(bool isAbstract) + { + classMapping.@abstract = isAbstract; + classMapping.abstractSpecified = true; + } public void Table(string tableName) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs index c2c33c62e60..81d01caaaf0 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs @@ -39,6 +39,11 @@ public Dictionary JoinMappers } #region ISubclassMapper Members + public void Abstract(bool isAbstract) + { + classMapping.@abstract = isAbstract; + classMapping.abstractSpecified = true; + } public void DiscriminatorValue(object value) { diff --git a/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs b/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs index f4886ca8024..f4993bd26a0 100644 --- a/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs +++ b/src/NHibernate/Mapping/ByCode/Impl/UnionSubclassMapper.cs @@ -150,6 +150,11 @@ public void Subselect(string sql) #endregion #region Implementation of IUnionSubclassAttributesMapper + public void Abstract(bool isAbstract) + { + classMapping.@abstract = isAbstract; + classMapping.abstractSpecified = true; + } public void Table(string tableName) {