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