From: <fab...@us...> - 2011-04-12 18:38:03
|
Revision: 5680 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5680&view=rev Author: fabiomaulo Date: 2011-04-12 18:37:57 +0000 (Tue, 12 Apr 2011) Log Message: ----------- ConventionModelMapper with convention for property column Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 17:55:24 UTC (rev 5679) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-04-12 18:37:57 UTC (rev 5680) @@ -16,8 +16,24 @@ protected virtual void AppendDefaultEvents() { BeforeMapJoinedSubclass += JoinedSubclassKeyAsRootIdColumn; + BeforeMapProperty += PropertyColumnName; } + protected void PropertyColumnName(IModelInspector modelInspector, PropertyPath member, IPropertyMapper propertyCustomizer) + { + if (member.PreviousPath == null || member.LocalMember == null) + { + return; + } + if (member.PreviousPath.LocalMember.GetPropertyOrFieldType().IsGenericCollection()) + { + return; + } + + var pathToMap = member.DepureFirstLevelIfCollection(); + propertyCustomizer.Column(pathToMap.ToColumnName()); + } + 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())); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs 2011-04-12 17:55:24 UTC (rev 5679) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyPathExtensions.cs 2011-04-12 18:37:57 UTC (rev 5680) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; namespace NHibernate.Mapping.ByCode @@ -43,5 +44,19 @@ analizing = analizing.PreviousPath; } while (analizing != null); } + + public static PropertyPath DepureFirstLevelIfCollection(this PropertyPath source) + { + // when the component is used as elements of a collection, the name of the property representing + // the collection itself may be ignored since each collection will have its own table. + // Note: In some cases may be a problem. + const int penultimateOffset = 2; + if (!source.GetRootMember().GetPropertyOrFieldType().IsGenericCollection()) + { + return source; + } + var paths = source.InverseProgressivePath().ToArray(); + return paths[paths.Length - penultimateOffset]; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-12 17:55:24 UTC (rev 5679) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-12 18:37:57 UTC (rev 5680) @@ -48,7 +48,7 @@ isTablePerClass = (t, declared) => declared || MatchTablePerClass(t); isPersistentId = (m, declared) => declared || MatchPoIdPattern(m); isComponent = (t, declared) => declared || MatchComponentPattern(t); - isPersistentProperty = (m, declared) => declared || MatchNoReadOnlyPropertyPattern(m); + isPersistentProperty = (m, declared) => declared || ((m is PropertyInfo) && MatchNoReadOnlyPropertyPattern(m)); isSet = (m, declared) => declared || MatchCollection(m, MatchSetMember); isArray = (m, declared) => declared || MatchCollection(m, MatchArrayMember); isBag = (m, declared) => declared || MatchCollection(m, MatchBagMember); Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyColumnNameTests.cs 2011-04-12 18:37:57 UTC (rev 5680) @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ConventionModelMapperTests +{ + public class PropertyColumnNameTests + { + private class MyClass + { + public int Id { get; set; } + public string Fake1 { get; set; } + } + + private class MyClassWithComponent + { + public int Id { get; set; } + public MyComponent Component1 { get; set; } + public IEnumerable<MyComponent> Components { get; set; } + } + + private class MyComponent + { + public string Fake0 { get; set; } + } + + [Test] + public void WhenAtClassLevelThenNoMatch() + { + var mapper = new ConventionModelMapper(); + var mapping = mapper.CompileMappingFor(new[] { typeof(MyClass) }); + var hbmClass = mapping.RootClasses[0]; + var hbmProperty = hbmClass.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake1"); + hbmProperty.Columns.Should().Be.Empty(); + } + + [Test] + public void WhenFirstLevelIsCollectionThenNoMatch() + { + var mapper = new ConventionModelMapper(); + var mapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithComponent) }); + var hbmClass = mapping.RootClasses[0]; + var hbmBag = hbmClass.Properties.OfType<HbmBag>().Single(x => x.Name == "Components"); + var hbmCompositeElement = (HbmCompositeElement) hbmBag.ElementRelationship; + var hbmProperty = hbmCompositeElement.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake0"); + hbmProperty.Columns.Should().Be.Empty(); + } + + [Test] + public void WhenAtComponentLevelThenMatch() + { + var mapper = new ConventionModelMapper(); + var mapping = mapper.CompileMappingFor(new[] { typeof(MyClassWithComponent) }); + var hbmClass = mapping.RootClasses[0]; + var hbmComponent = hbmClass.Properties.OfType<HbmComponent>().Single(); + var hbmProperty = hbmComponent.Properties.OfType<HbmProperty>().Single(x => x.Name == "Fake0"); + hbmProperty.Columns.Single().name.Should().Be("Component1Fake0"); + } + } +} \ 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 17:55:24 UTC (rev 5679) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-12 18:37:57 UTC (rev 5680) @@ -512,6 +512,7 @@ <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> <Compile Include="MappingByCode\ConventionModelMapperTests\JoinedSubclassKeyAsRootIdColumnTest.cs" /> + <Compile Include="MappingByCode\ConventionModelMapperTests\PropertyColumnNameTests.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. |