|
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.
|