|
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();
+ hbm...@cl...().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();
+ hbm...@cl...().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.
|