From: <fab...@us...> - 2011-04-08 14:13:27
|
Revision: 5641 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5641&view=rev Author: fabiomaulo Date: 2011-04-08 14:13:21 +0000 (Fri, 08 Apr 2011) Log Message: ----------- Fix NH-2633 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ClassWithComponentsTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -19,9 +19,9 @@ private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); - private readonly HashSet<MemberInfo> persistentProperties = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>(); @@ -135,6 +135,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> PersistentMembers + { + get { return persistentMembers; } + } + public IEnumerable<SplitDefinition> SplitDefinitions { get { return splitDefinitions; } @@ -284,94 +289,99 @@ public void AddAsOneToOneRelation(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); oneToOneRelations.Add(member); } public void AddAsManyToOneRelation(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); manyToOneRelations.Add(member); } public void AddAsManyToManyRelation(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); manyToManyRelations.Add(member); } public void AddAsOneToManyRelation(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); oneToManyRelations.Add(member); } public void AddAsAny(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); any.Add(member); } public void AddAsPoid(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); poids.Add(member); } public void AddAsVersionProperty(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); versionProperties.Add(member); } public void AddAsNaturalId(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); naturalIds.Add(member); } public void AddAsSet(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); sets.Add(member); } public void AddAsBag(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); bags.Add(member); } public void AddAsIdBag(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); idBags.Add(member); } public void AddAsList(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); lists.Add(member); } public void AddAsArray(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); arrays.Add(member); } public void AddAsMap(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); dictionaries.Add(member); } public void AddAsProperty(MemberInfo member) { - persistentProperties.Add(member); + persistentMembers.Add(member); properties.Add(member); } + public void AddAsPersistentMember(MemberInfo member) + { + persistentMembers.Add(member); + } + public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) { /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem @@ -484,7 +494,7 @@ public bool IsPersistentProperty(MemberInfo member) { - return persistentProperties.Contains(member); + return persistentMembers.Contains(member); } public bool IsSet(MemberInfo role) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -21,6 +21,7 @@ private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly IEnumerable<System.Type> rootEntities = Enumerable.Empty<System.Type>(); private readonly IEnumerable<MemberInfo> sets = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<System.Type> tablePerClassEntities = Enumerable.Empty<System.Type>(); @@ -137,6 +138,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> PersistentMembers + { + get { return persistentMembers; } + } + public IEnumerable<SplitDefinition> SplitDefinitions { get { return splitDefinitions; } @@ -193,6 +199,8 @@ public void AddAsMap(MemberInfo member) {} public void AddAsProperty(MemberInfo member) {} + public void AddAsPersistentMember(MemberInfo member){} + public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) {} #endregion Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -42,6 +42,7 @@ IEnumerable<MemberInfo> Arrays { get; } IEnumerable<MemberInfo> Dictionaries { get; } IEnumerable<MemberInfo> Properties { get; } + IEnumerable<MemberInfo> PersistentMembers { get; } IEnumerable<SplitDefinition> SplitDefinitions { get; } IEnumerable<string> GetSplitGroupsFor(System.Type type); @@ -70,6 +71,7 @@ void AddAsArray(MemberInfo member); void AddAsMap(MemberInfo member); void AddAsProperty(MemberInfo member); + void AddAsPersistentMember(MemberInfo member); void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentCustomizer.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentCustomizer.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -25,6 +25,10 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsComponent(typeof (TComponent)); + if(propertyPath != null) + { + explicitDeclarationsHolder.AddAsPersistentMember(propertyPath.LocalMember); + } } #region Implementation of IComponentMapper<TComponent> Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -20,6 +21,7 @@ private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>(); @@ -130,6 +132,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> PersistentMembers + { + get { return persistentMembers; } + } + public IEnumerable<SplitDefinition> SplitDefinitions { get { return splitDefinitions; } @@ -245,6 +252,11 @@ properties.Add(member); } + public void AddAsPersistentMember(MemberInfo member) + { + persistentMembers.Add(member); + } + public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) { splitDefinitions.Add(new SplitDefinition(propertyContainer, splitGroupId, member)); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using System.Linq; -using System.Reflection; namespace NHibernate.Mapping.ByCode { @@ -37,6 +34,7 @@ System.Array.ForEach(source.Arrays.ToArray(), destination.AddAsArray); System.Array.ForEach(source.Dictionaries.ToArray(), destination.AddAsMap); System.Array.ForEach(source.Properties.ToArray(), destination.AddAsProperty); + System.Array.ForEach(source.PersistentMembers.ToArray(), destination.AddAsPersistentMember); System.Array.ForEach(source.SplitDefinitions.ToArray(), x => destination.AddAsPropertySplit(x.On, x.GroupId, x.Member)); } } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ClassWithComponentsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ClassWithComponentsTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ClassWithComponentsTest.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -0,0 +1,61 @@ +using System; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class ClassWithComponentsTest + { + public class Person1 + { + public int Id { get; set; } + public string Test { get; set; } + public Name Name { get; set; } + public Address Address { get; set; } + } + public class Name + { + public string First { get; set; } + public string Last { get; set; } + } + + public class Address + { + public string Street { get; set; } + public int CivicNumber { get; set; } + } + [Test] + public void ComponentMappingJustOnceDemo() + { + var mapper = new ModelMapper(); + mapper.Component<Name>(comp => + { + comp.Property(name => name.First); + comp.Property(name => name.Last); + }); + mapper.Component<Address>(comp => + { + comp.Property(address => address.CivicNumber); + comp.Property(address => address.Street); + }); + mapper.Class<Person1>(cm => + { + cm.Id(person => person.Id, map => map.Generator(Generators.HighLow)); + cm.Property(person => person.Test); + cm.Component(person => person.Name, comp => { }); + cm.Component(person => person.Address, comp => { }); + }); + + var hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities(); + + var hbmClass = hbmMapping.RootClasses[0]; + + var hbmComponents = hbmClass.Properties.OfType<HbmComponent>(); + hbmComponents.Should().Have.Count.EqualTo(2); + hbmComponents.Select(x => x.Name).Should().Have.SameValuesAs("Name","Address"); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-08 14:13:21 UTC (rev 5641) @@ -29,6 +29,17 @@ } [Test] + public void MergePersistentMembers() + { + var destination = new ExplicitDeclarationsHolder(); + var source = new ExplicitDeclarationsHolder(); + source.AddAsPersistentMember(property); + + destination.Merge(source); + destination.PersistentMembers.Should().Have.Count.EqualTo(1); + } + + [Test] public void MergeProperties() { var destination = new ExplicitDeclarationsHolder(); Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-08 05:48:54 UTC (rev 5640) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-08 14:13:21 UTC (rev 5641) @@ -509,6 +509,7 @@ <Compile Include="Linq\ByMethod\SumTests.cs" /> <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ClassMappingRegistrationTest.cs" /> <Compile Include="MappingByCode\CustomizerHolderMergeTest.cs" /> <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SplitPropertiesRegistrationTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |