From: <fab...@us...> - 2011-04-05 18:52:08
|
Revision: 5614 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5614&view=rev Author: fabiomaulo Date: 2011-04-05 18:52:02 +0000 (Tue, 05 Apr 2011) Log Message: ----------- SubclassCustomizer with Joins Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/SubclassPropertiesSplitsTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs 2011-04-05 18:28:43 UTC (rev 5613) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SubclassMapper.cs 2011-04-05 18:52:02 UTC (rev 5614) @@ -33,7 +33,7 @@ #endregion - private Dictionary<string, IJoinMapper> JoinMappers + public Dictionary<string, IJoinMapper> JoinMappers { get { return joinMappers ?? (joinMappers = new Dictionary<string, IJoinMapper>()); } } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 18:28:43 UTC (rev 5613) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 18:52:02 UTC (rev 5614) @@ -622,14 +622,32 @@ } } candidateProperties = candidateProperties ?? membersProvider.GetSubEntityMembers(type, type.BaseType); - IEnumerable<MemberInfo> propertiesToMap = - candidateProperties.Where(p => modelInspector.IsPersistentProperty(p) && !modelInspector.IsPersistentId(p)); InvokeBeforeMapSubclass(type, classMapper); customizerHolder.InvokeCustomizers(type, classMapper); + foreach (var joinMapper in classMapper.JoinMappers.Values) + { + customizerHolder.InvokeCustomizers(type, joinMapper); + } + + var splitGroups = modelInspector.GetPropertiesSplits(type); + var propertiesToMap = candidateProperties.Where(p => modelInspector.IsPersistentProperty(p) && !modelInspector.IsPersistentId(p)); + var propertiesInSplits = new HashSet<MemberInfo>(); + foreach (var splitGroup in splitGroups) + { + var groupId = splitGroup; + var propertiesOfTheGroup = propertiesToMap.Where(p => modelInspector.IsTablePerClassSplit(type, groupId, p)).ToList(); + IJoinMapper joinMapper; + if (propertiesOfTheGroup.Count > 0 && classMapper.JoinMappers.TryGetValue(groupId, out joinMapper)) + { + MapProperties(type, propertiesOfTheGroup, joinMapper); + propertiesInSplits.UnionWith(propertiesOfTheGroup); + } + } + + MapProperties(type, propertiesToMap.Except(propertiesInSplits), classMapper); + InvokeAfterMapSubclass(type, classMapper); - - MapProperties(type, propertiesToMap, classMapper); } private void MapJoinedSubclass(System.Type type, HbmMapping mapping) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/SubclassPropertiesSplitsTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/SubclassPropertiesSplitsTests.cs 2011-04-05 18:28:43 UTC (rev 5613) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/SubclassPropertiesSplitsTests.cs 2011-04-05 18:52:02 UTC (rev 5614) @@ -75,5 +75,35 @@ inspector.IsTablePerClassSplit(typeof(MyClass), "MyClassSplit2", For<Inherited>.Property(x => x.SomethingB2)).Should().Be.True(); } + [Test] + public void WhenMapSplittedPropertiesThenEachPropertyIsInItsSplitGroup() + { + var inspector = new ExplicitlyDeclaredModel(); + var mapper = new ModelMapper(inspector); + mapper.Class<MyClass>(map => map.Id(x => x.Id, idmap => { })); + mapper.Subclass<Inherited>(map => + { + map.Join("MyClassSplit1", mj => + { + mj.Property(x => x.SomethingA1); + mj.Property(x => x.SomethingA2); + }); + map.Join("MyClassSplit2", mj => + { + mj.Property(x => x.SomethingB1); + mj.Property(x => x.SomethingB2); + }); + map.Property(x => x.Something0); + }); + var hbmDoc = mapper.CompileMappingFor(new[] { typeof(Inherited) }); + + var hbmClass = hbmDoc.SubClasses[0]; + hbmClass.Joins.Select(j => j.table).Should().Have.SameValuesAs("MyClassSplit1", "MyClassSplit2"); + hbmClass.Properties.Single().Name.Should().Be("Something0"); + var hbmSplit1 = hbmClass.Joins.Single(j => "MyClassSplit1" == j.table); + hbmSplit1.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingA1", "SomethingA2"); + var hbmSplit2 = hbmClass.Joins.Single(j => "MyClassSplit2" == j.table); + hbmSplit2.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingB1", "SomethingB2"); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |