From: <fab...@us...> - 2011-04-12 17:50:40
|
Revision: 5678 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5678&view=rev Author: fabiomaulo Date: 2011-04-12 17:50:33 +0000 (Tue, 12 Apr 2011) Log Message: ----------- ConventionModelMapper with convention for joined-subclass key column Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 17:50:33 UTC (rev 5678) @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace NHibernate.Mapping.ByCode +{ + public class ConventionModelMapper : ModelMapper + { + public ConventionModelMapper() + : base(new SimpleModelInspector()) + { + AppendDefaultEvents(); + } + + protected virtual void AppendDefaultEvents() + { + BeforeMapJoinedSubclass += JoinedSubclassKeyAsRootIdColumn; + } + + protected void JoinedSubclassKeyAsRootIdColumn(IModelInspector modelInspector, System.Type type, IJoinedSubclassAttributesMapper joinedSubclassCustomizer) + { + var idMember = type.GetProperties().Cast<MemberInfo>().Concat(type.GetFields()).FirstOrDefault(mi => ModelInspector.IsPersistentId(mi.GetMemberFromDeclaringType())); + if (idMember != null) + { + joinedSubclassCustomizer.Key(km => km.Column(idMember.Name)); + } + } + + protected SimpleModelInspector SimpleModelInspector + { + get { return (SimpleModelInspector) base.ModelInspector; } + } + + public void IsRootEntity(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsRootEntity(match); + } + + public void IsComponent(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsComponent(match); + } + + public void IsEntity(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsEntity(match); + } + + public void IsTablePerClass(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsTablePerClass(match); + } + + public void IsTablePerClassHierarchy(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsTablePerClassHierarchy(match); + } + + public void IsTablePerConcreteClass(Func<System.Type, bool, bool> match) + { + SimpleModelInspector.IsTablePerConcreteClass(match); + } + + public void IsOneToOne(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsOneToOne(match); + } + + public void IsManyToOne(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsManyToOne(match); + } + + public void IsManyToMany(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsManyToMany(match); + } + + public void IsOneToMany(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsOneToMany(match); + } + + public void IsAny(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsAny(match); + } + + public void IsPersistentId(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsPersistentId(match); + } + + public void IsVersion(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsVersion(match); + } + + public void IsMemberOfNaturalId(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsMemberOfNaturalId(match); + } + + public void IsPersistentProperty(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsPersistentProperty(match); + } + + public void IsSet(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsSet(match); + } + + public void IsBag(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsBag(match); + } + + public void IsIdBag(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsIdBag(match); + } + + public void IsList(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsList(match); + } + + public void IsArray(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsArray(match); + } + + public void IsDictionary(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsDictionary(match); + } + + public void IsProperty(Func<MemberInfo, bool, bool> match) + { + SimpleModelInspector.IsProperty(match); + } + + public void SplitsFor(Func<System.Type, IEnumerable<string>, IEnumerable<string>> getPropertiesSplitsId) + { + SimpleModelInspector.SplitsFor(getPropertiesSplitsId); + } + + public void IsTablePerClassSplit(Func<SplitDefinition, bool, bool> match) + { + SimpleModelInspector.IsTablePerClassSplit(match); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-12 14:27:47 UTC (rev 5677) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-12 17:50:33 UTC (rev 5678) @@ -438,6 +438,7 @@ <Compile Include="Mapping\Column.cs" /> <Compile Include="Mapping\Component.cs" /> <Compile Include="Mapping\Constraint.cs" /> + <Compile Include="Mapping\ByCode\ConventionModelMapper.cs" /> <Compile Include="Mapping\ForeignKey.cs" /> <Compile Include="Mapping\Formula.cs" /> <Compile Include="Mapping\IdentifierBag.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/JoinedSubclassKeyAsRootIdColumnTest.cs 2011-04-12 17:50:33 UTC (rev 5678) @@ -0,0 +1,53 @@ +using System.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ConventionModelMapperTests +{ + public class JoinedSubclassKeyAsRootIdColumnTest + { + private class MyClass + { + public int MyId { get; set; } + public int HisId { get; set; } + } + + private class Inherited : MyClass + { + } + + [Test] + public void WhenBaseIsIdThenUseId() + { + var mapper = new ConventionModelMapper(); + mapper.Class<MyClass>(map=> map.Id(x=> x.MyId)); + var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) }); + var hbmJoinedClass = mapping.JoinedSubclasses[0]; + + hbmJoinedClass.key.Columns.Single().name.Should().Be("MyId"); + } + + [Test] + public void WhenBaseIsPoIdThenUsePoId() + { + var mapper = new ConventionModelMapper(); + mapper.Class<MyClass>(map => map.Id(x => x.HisId)); + var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) }); + var hbmJoinedClass = mapping.JoinedSubclasses[0]; + + hbmJoinedClass.key.Columns.Single().name.Should().Be("HisId"); + } + + [Test] + public void WhenNoPoidMemberThenDoesNotSet() + { + var mapper = new ConventionModelMapper(); + mapper.Class<MyClass>(map => { }); + var mapping = mapper.CompileMappingFor(new[] { typeof(Inherited), typeof(MyClass) }); + var hbmJoinedClass = mapping.JoinedSubclasses[0]; + + hbmJoinedClass.key.Columns.Single().name.Should().Not.Be("MyId").And.Not.Be("HisId"); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 14:27:47 UTC (rev 5677) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 17:50:33 UTC (rev 5678) @@ -511,6 +511,7 @@ <Compile Include="Linq\ByMethod\SumTests.cs" /> <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> + <Compile Include="MappingByCode\ConventionModelMapperTests\JoinedSubclassKeyAsRootIdColumnTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ClassMappingRegistrationTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |