From: <fab...@us...> - 2011-04-27 12:09:01
|
Revision: 5771 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5771&view=rev Author: fabiomaulo Date: 2011-04-27 12:08:50 +0000 (Wed, 27 Apr 2011) Log Message: ----------- ClassMapper with ComponentAsId and ComposedId Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -8,6 +8,10 @@ { void Id(Action<IIdMapper> idMapper); void Id(MemberInfo idProperty, Action<IIdMapper> idMapper); + + void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> idMapper); + void ComposedId(Action<IComposedIdMapper> idPropertiesMapping); + void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); @@ -37,6 +41,12 @@ void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty); void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper); void Id(FieldInfo idProperty, Action<IIdMapper> idMapper); + + //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class; + //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class; + + //void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping); + void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -68,6 +68,32 @@ mapper(new IdMapper(idProperty, id)); } + public void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> mapper) + { + if (!IsMemberSupportedByMappedContainer(idProperty)) + { + throw new ArgumentOutOfRangeException("idProperty", "Can't use, as component id property, a property of another graph"); + } + var id = classMapping.Item as HbmCompositeId; + if(id == null) + { + id = new HbmCompositeId(); + classMapping.Item = id; + } + mapper(new ComponentAsIdMapper(idProperty.GetPropertyOrFieldType(), idProperty, id, mapDoc)); + } + + public void ComposedId(Action<IComposedIdMapper> idPropertiesMapping) + { + var id = classMapping.Item as HbmCompositeId; + if (id == null) + { + id = new HbmCompositeId(); + classMapping.Item = id; + } + idPropertiesMapping(new ComposedIdMapper(Container, id, mapDoc)); + } + public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping) { if (discriminatorMapper == null) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -7,11 +7,13 @@ { public class ComposedIdMapper : IComposedIdMapper { + private readonly System.Type container; private readonly HbmCompositeId id; private readonly HbmMapping mapDoc; - public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc) + public ComposedIdMapper(System.Type container, HbmCompositeId id, HbmMapping mapDoc) { + this.container = container; this.id = id; this.mapDoc = mapDoc; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -0,0 +1,85 @@ +using System; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests +{ + public class ComponetAsIdTests + { + private class PersonId + { + public string Email { get; set; } + public User User { get; set; } + } + + private class Person + { + private PersonId id; + public PersonId Id + { + get { return id; } + } + + public string Name { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenClassWithComponentIdThenTheIdIsConpositeId() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => + { + map.Property(For<PersonId>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { }); + }); + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Should().Not.Be.Null(); + hbmCompositeId.@class.Should().Not.Be.Null(); + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty),typeof(HbmKeyManyToOne)); + } + + [Test] + public void WhenComponentIdCustomizedMoreThanOnceThenMerge() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => + { + map.Property(For<PersonId>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { }); + }); + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Access(Accessor.Field)); + + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.access.Should().Contain("field"); + } + + [Test] + public void WhenMapExternalMemberAsComponentIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.Executing(m => m.ComponentAsId(For<User>.Property(x => x.Id), map => map.Access(Accessor.Field))).Throws<ArgumentOutOfRangeException>(); + } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -0,0 +1,57 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests +{ + public class ComposedIdTests + { + private class Person + { + public string Email { get; set; } + public User User { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenClassWithComposedIdThenTheIdIsConpositeId() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, null); + + mapper.ComposedId(map => + { + map.Property(For<Person>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<Person>.Property(x => x.User), pm => { }); + }); + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Should().Not.Be.Null(); + hbmCompositeId.@class.Should().Be.Null(); + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty), typeof(HbmKeyManyToOne)); + } + + [Test] + public void WhenComposedIdCustomizedMoreThanOnceThenMerge() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, null); + + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Email), pm => { })); + mapper.ComposedId(map => map.ManyToOne(For<Person>.Property(x => x.User), pm => { })); + + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -24,7 +24,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); mapper.Property(For<Person>.Property(ts => ts.Email), x => { }); @@ -38,7 +38,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); var called = false; mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true); @@ -51,7 +51,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { }); @@ -65,7 +65,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); var called = false; mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true); Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 12:08:50 UTC (rev 5771) @@ -549,6 +549,8 @@ <Compile Include="MappingByCode\For.cs" /> <Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ClassMapperWithJoinPropertiesTest.cs" /> + <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComponetAsIdTests.cs" /> + <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComposedIdTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |