From: <fab...@us...> - 2011-04-19 17:50:32
|
Revision: 5720 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5720&view=rev Author: fabiomaulo Date: 2011-04-19 17:50:26 +0000 (Tue, 19 Apr 2011) Log Message: ----------- Fixed nested components with parent Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/BagOfNestedComponentsWithParentTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NestedComponetsTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-19 17:36:06 UTC (rev 5719) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-19 17:50:26 UTC (rev 5720) @@ -1030,14 +1030,23 @@ { propertiesContainer.Component(member, componentMapper => { - InvokeBeforeMapComponent(memberPath, componentMapper); + InvokeBeforeMapComponent(memberPath, componentMapper); // <<== perhaps is better after find the parent System.Type componentType = propertyType; IEnumerable<MemberInfo> persistentProperties = membersProvider.GetComponentMembers(componentType).Where(p => modelInspector.IsPersistentProperty(p)); - MemberInfo parentReferenceProperty = persistentProperties.FirstOrDefault(pp => pp.GetPropertyOrFieldType() == propertiesContainerType); - - customizerHolder.InvokeCustomizers(componentType, componentMapper); + MemberInfo parentReferenceProperty = modelInspector.IsComponent(propertiesContainerType) + ? persistentProperties.FirstOrDefault(pp => pp.GetPropertyOrFieldType() == propertiesContainerType) + : null; + if (parentReferenceProperty != null) + { + componentMapper.Parent(parentReferenceProperty, + componentParentMapper => + { + /* TODO */ + }); + } + customizerHolder.InvokeCustomizers(componentType, componentMapper); ForEachMemberPath(member, memberPath, pp => customizerHolder.InvokeCustomizers(pp, componentMapper)); InvokeAfterMapComponent(memberPath, componentMapper); @@ -1225,7 +1234,10 @@ relation.Component(x => { IEnumerable<MemberInfo> persistentProperties = GetPersistentProperties(componentType); - MemberInfo parentReferenceProperty = persistentProperties.FirstOrDefault(pp => pp.GetPropertyOrFieldType() == ownerType); + + MemberInfo parentReferenceProperty = domainInspector.IsComponent(ownerType) + ? persistentProperties.FirstOrDefault(pp => pp.GetPropertyOrFieldType() == ownerType) + : null; if (parentReferenceProperty != null) { x.Parent(parentReferenceProperty, @@ -1281,6 +1293,7 @@ System.Type componentPropertyType = propertyType; IEnumerable<MemberInfo> componentProperties = GetPersistentProperties(componentPropertyType); + MemberInfo parentReferenceProperty = componentProperties.FirstOrDefault(pp => pp.GetPropertyOrFieldType() == componentOwnerType); if (parentReferenceProperty != null) { Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/BagOfNestedComponentsWithParentTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/BagOfNestedComponentsWithParentTest.cs 2011-04-19 17:36:06 UTC (rev 5719) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/BagOfNestedComponentsWithParentTest.cs 2011-04-19 17:50:26 UTC (rev 5720) @@ -105,10 +105,14 @@ collection.ElementRelationship.Should().Be.OfType<HbmCompositeElement>(); var elementRelation = (HbmCompositeElement)collection.ElementRelationship; elementRelation.Class.Should().Contain("Address"); - elementRelation.Properties.Should().Have.Count.EqualTo(2); - elementRelation.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Street", "Number"); - elementRelation.Parent.Should().Not.Be.Null(); - elementRelation.Parent.name.Should().Be.EqualTo("Owner"); + + // This test was modified because when the "owner" is an entity it can be mapped as many-to-one or as parent and without an explicit + // definition of the property representing the bidiretional-relation we can't know is the mapping element (many-to-one or parent) + elementRelation.Properties.Should().Have.Count.EqualTo(3); + elementRelation.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Street", "Number", "Owner"); + //elementRelation.Parent.Should().Not.Be.Null(); + //elementRelation.Parent.name.Should().Be.EqualTo("Owner"); + // Nested var propertyNestedRelation = elementRelation.Properties.FirstOrDefault(p => p.Name == "Number"); propertyNestedRelation.Should().Not.Be.Null().And.Be.OfType<HbmNestedCompositeElement>(); Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NestedComponetsTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NestedComponetsTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NestedComponetsTests.cs 2011-04-19 17:50:26 UTC (rev 5720) @@ -0,0 +1,155 @@ +using System.Collections.Generic; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class NestedComponetsTests + { + private class MyClass + { + public int Id { get; set; } + public MyCompo Compo { get; set; } + public IEnumerable<MyCompo> Compos { get; set; } + } + + private class MyCompo + { + public MyClass AManyToOne { get; set; } + public MyNestedCompo NestedCompo { get; set; } + } + + private class MyNestedCompo + { + public MyCompo Owner { get; set; } + public string Something { get; set; } + } + + private HbmMapping GetMappingWithManyToOneInCompo() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(x => + { + x.Id(c => c.Id); + x.Component(c => c.Compo); + x.Bag(c => c.Compos, cm => { }); + }); + mapper.Component<MyCompo>(x => + { + x.ManyToOne(c => c.AManyToOne); + x.Component(c => c.NestedCompo); + }); + mapper.Component<MyNestedCompo>(x => + { + x.Component(c => c.Owner); + x.Property(c => c.Something); + }); + return mapper.CompileMappingForAllExplicitAddedEntities(); + } + + private HbmMapping GetMappingWithParentInCompo() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(x => + { + x.Id(c => c.Id); + x.Component(c => c.Compo); + x.Bag(c => c.Compos, cm => { }); + }); + mapper.Component<MyCompo>(x => + { + x.Parent(c => c.AManyToOne); + x.Component(c => c.NestedCompo); + }); + mapper.Component<MyNestedCompo>(x => + { + x.Component(c => c.Owner); + x.Property(c => c.Something); + }); + return mapper.CompileMappingForAllExplicitAddedEntities(); + } + + [Test] + public void WhenMapComoponetWithNestBidirectionalComponentThenMapParent() + { + HbmMapping mapping = GetMappingWithManyToOneInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmMyCompo = hbmClass.Properties.OfType<HbmComponent>().Single(); + var hbmMyNestedCompo = hbmMyCompo.Properties.OfType<HbmComponent>().Single(); + + hbmMyNestedCompo.Properties.Should().Have.Count.EqualTo(1); + hbmMyNestedCompo.Parent.Should().Not.Be.Null(); + hbmMyNestedCompo.Parent.name.Should().Be("Owner"); + } + + [Test] + public void WhenCollectionOfComoponetsWithNestBidirectionalComponentThenMapParent() + { + HbmMapping mapping = GetMappingWithManyToOneInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmBag = hbmClass.Properties.OfType<HbmBag>().Single(); + + var hbmMyCompo = (HbmCompositeElement)hbmBag.ElementRelationship; + var hbmMyNestedCompo = hbmMyCompo.Properties.OfType<HbmNestedCompositeElement>().Single(); + + hbmMyNestedCompo.Properties.Should().Have.Count.EqualTo(1); + hbmMyNestedCompo.Parent.Should().Not.Be.Null(); + hbmMyNestedCompo.Parent.name.Should().Be("Owner"); + } + + [Test] + public void WhenMapComoponetWithManyToOneThenMapManyToOne() + { + HbmMapping mapping = GetMappingWithManyToOneInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmMyCompo = hbmClass.Properties.OfType<HbmComponent>().Single(); + hbmMyCompo.Properties.OfType<HbmManyToOne>().Should().Have.Count.EqualTo(1); + hbmMyCompo.Parent.Should().Be.Null(); + } + + [Test] + public void WhenCollectionOfComoponetsWithManyToOneThenMapManyToOne() + { + HbmMapping mapping = GetMappingWithManyToOneInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmBag = hbmClass.Properties.OfType<HbmBag>().Single(); + + var hbmMyCompo = (HbmCompositeElement)hbmBag.ElementRelationship; + hbmMyCompo.Properties.OfType<HbmManyToOne>().Should().Have.Count.EqualTo(1); + hbmMyCompo.Parent.Should().Be.Null(); + } + + [Test] + public void WhenMapComoponetWithParentThenMapParent() + { + HbmMapping mapping = GetMappingWithParentInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmMyCompo = hbmClass.Properties.OfType<HbmComponent>().Single(); + hbmMyCompo.Properties.OfType<HbmManyToOne>().Should().Be.Empty(); + hbmMyCompo.Parent.Should().Not.Be.Null(); + hbmMyCompo.Parent.name.Should().Be("AManyToOne"); + } + + [Test] + public void WhenCollectionOfComoponetsWithParentThenMapParent() + { + HbmMapping mapping = GetMappingWithParentInCompo(); + + var hbmClass = mapping.RootClasses[0]; + var hbmBag = hbmClass.Properties.OfType<HbmBag>().Single(); + + var hbmMyCompo = (HbmCompositeElement)hbmBag.ElementRelationship; + hbmMyCompo.Properties.OfType<HbmManyToOne>().Should().Be.Empty(); + hbmMyCompo.Parent.Should().Not.Be.Null(); + hbmMyCompo.Parent.name.Should().Be("AManyToOne"); + } + } +} \ 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-19 17:36:06 UTC (rev 5719) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-19 17:50:26 UTC (rev 5720) @@ -537,6 +537,7 @@ <Compile Include="MappingByCode\ExpliticMappingTests\IdBagMappingTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\NaturalIdTests.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\NestedComponetsTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\PoidTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\RootClassPropertiesSplitsTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\SubclassPropertiesSplitsTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |