You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
(248) |
May
(82) |
Jun
(90) |
Jul
(177) |
Aug
(253) |
Sep
(157) |
Oct
(151) |
Nov
(143) |
Dec
(278) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(152) |
Feb
(107) |
Mar
(177) |
Apr
(133) |
May
(259) |
Jun
(81) |
Jul
(119) |
Aug
(306) |
Sep
(416) |
Oct
(240) |
Nov
(329) |
Dec
(206) |
2006 |
Jan
(466) |
Feb
(382) |
Mar
(153) |
Apr
(162) |
May
(133) |
Jun
(21) |
Jul
(18) |
Aug
(37) |
Sep
(97) |
Oct
(114) |
Nov
(110) |
Dec
(28) |
2007 |
Jan
(74) |
Feb
(65) |
Mar
(49) |
Apr
(76) |
May
(43) |
Jun
(15) |
Jul
(68) |
Aug
(55) |
Sep
(63) |
Oct
(59) |
Nov
(70) |
Dec
(66) |
2008 |
Jan
(71) |
Feb
(60) |
Mar
(120) |
Apr
(31) |
May
(48) |
Jun
(81) |
Jul
(107) |
Aug
(51) |
Sep
(80) |
Oct
(83) |
Nov
(83) |
Dec
(79) |
2009 |
Jan
(83) |
Feb
(110) |
Mar
(97) |
Apr
(91) |
May
(291) |
Jun
(250) |
Jul
(197) |
Aug
(58) |
Sep
(54) |
Oct
(122) |
Nov
(68) |
Dec
(34) |
2010 |
Jan
(50) |
Feb
(17) |
Mar
(63) |
Apr
(61) |
May
(84) |
Jun
(81) |
Jul
(138) |
Aug
(144) |
Sep
(78) |
Oct
(26) |
Nov
(30) |
Dec
(61) |
2011 |
Jan
(33) |
Feb
(35) |
Mar
(166) |
Apr
(221) |
May
(109) |
Jun
(76) |
Jul
(27) |
Aug
(37) |
Sep
(1) |
Oct
(4) |
Nov
(2) |
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
(2) |
Apr
(2) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2013 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(3) |
Oct
(2) |
Nov
|
Dec
(1) |
2014 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <pa...@us...> - 2011-04-23 20:10:55
|
Revision: 5753 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5753&view=rev Author: patearl Date: 2011-04-23 20:10:49 +0000 (Sat, 23 Apr 2011) Log Message: ----------- Types: Improved compatibility of TimeAsTimeSpanType by avoiding dependence on specific base date. (Specifically fixes problem with PostgreSQL.) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs Modified: trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs 2011-04-23 20:05:03 UTC (rev 5752) +++ trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs 2011-04-23 20:10:49 UTC (rev 5753) @@ -35,7 +35,7 @@ if(value is TimeSpan) return (TimeSpan)value; - return ((DateTime)value).Subtract(BaseDateValue); + return ((DateTime)value).TimeOfDay; } catch (Exception ex) { @@ -51,7 +51,7 @@ if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. return (TimeSpan)value; - return ((DateTime)value).Subtract(BaseDateValue); + return ((DateTime)value).TimeOfDay; } catch (Exception ex) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-23 20:05:09
|
Revision: 5752 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5752&view=rev Author: fabiomaulo Date: 2011-04-23 20:05:03 +0000 (Sat, 23 Apr 2011) Log Message: ----------- Fix NH-1747 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -43,11 +43,11 @@ InitStatementString(elementPersister, alias, batchSize, subquery); } - // NH-1747 FIX - //protected override string GenerateAliasForColumn(string rootAlias, string column) - //{ - // return elementPersister.GenerateTableAliasForColumn(rootAlias, column); - //} + protected override string GenerateAliasForColumn(string rootAlias, string column) + { + // NH-1747 FIX (see OneToManyPersister) + return elementPersister.GenerateTableAliasForColumn(rootAlias, column); + } private void InitStatementString(IOuterJoinLoadable elementPersister, string alias, int batchSize, SqlString subquery) { Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -321,21 +321,27 @@ .ToString(); } - // NH-1747 FIX - //protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix) - //{ - // var ojl = (IOuterJoinLoadable)ElementPersister; - // var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix); - // var columnNames = KeyColumnNames; - // var columnAliases = KeyColumnAliases; - // for (int i = 0; i < columnNames.Length; i++) - // { - // var column = columnNames[i]; - // var tableAlias = ojl.GenerateTableAliasForColumn(alias, column); - // selectFragment.AddColumn(tableAlias, column, columnAliases[i]); - // } - // return selectFragment; - //} + protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix) + { + /* + NH-1747 FIX + Note: the fix for NH-1747 may cause some problem when the same ColumnName is used to represent two different properties in the same hierarchy + In all our test it happened only for NHibernate.Test.Legacy.MultiTableTest.MultiTableCollections + The mapping Multi.hbm.xml had a column named "parent" to represent the Key of a set for the relation Lower->Top and SubMulti->SubMulti everything in the same hierarchy + NH TODO: Have to add an early check of same ColumnName used to represent two relations. + */ + var ojl = (IOuterJoinLoadable)ElementPersister; + var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix); + var columnNames = KeyColumnNames; + var columnAliases = KeyColumnAliases; + for (int i = 0; i < columnNames.Length; i++) + { + var column = columnNames[i]; + var tableAlias = ojl.GenerateTableAliasForColumn(alias, column); + selectFragment.AddColumn(tableAlias, column, columnAliases[i]); + } + return selectFragment; + } /// <summary> /// Create the <see cref="OneToManyLoader" /> Modified: trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 20:05:03 UTC (rev 5752) @@ -62,10 +62,10 @@ <key column="sid"/> <property name="Amount" column="dupe"/> <bag name="Children" lazy="true" inverse="true" > - <key column="parent"/> + <key column="parentId"/> <one-to-many class="NHibernate.DomainModel.SubMulti, NHibernate.DomainModel"/> </bag> - <many-to-one name="Parent" column="parent" /> + <many-to-one name="Parent" column="parentId" /> <list name="MoreChildren" lazy="true"> <key column="another_parent"/> <index column="list_ind"/> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -43,7 +43,7 @@ } } - [Test, Ignore("The fix was commented in the code. Look for NH-1747")] + [Test] public void TraversingBagToJoinChildElementShouldWork() { using (ISession session = OpenSession()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-23 18:51:43
|
Revision: 5751 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5751&view=rev Author: fabiomaulo Date: 2011-04-23 18:51:34 +0000 (Sat, 23 Apr 2011) Log Message: ----------- - Fix NH-2669 (patch completed, and test fixed) thanks to Rory Plaire to port the Hb fix - Fix NH-2670 - Fix ByCode (subclass registration and TypeNameUtil) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -393,5 +393,8 @@ bool IsReadOnly(object entityOrProxy); void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId); + + /// <summary>Is in a two-phase load? </summary> + bool IsLoadFinished { get; } } } Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -1205,6 +1205,14 @@ oldEntry.LoadedWithLazyPropertiesUnfetched); } + public bool IsLoadFinished + { + get + { + return loadCounter == 0; + } + } + #endregion public override string ToString() Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -53,7 +53,15 @@ public override void InitializeCollection(IPersistentCollection collection, bool writing) { - throw new SessionException("collections cannot be fetched by a stateless session"); + if(temporaryPersistenceContext.IsLoadFinished) + { + throw new SessionException("Collections cannot be fetched by a stateless session. You can eager load it through specific query."); + } + CollectionEntry ce = temporaryPersistenceContext.GetCollectionEntry(collection); + if (!collection.WasInitialized) + { + ce.LoadedPersister.Initialize(ce.LoadedKey, this); + } } public override object InternalLoad(string entityName, object id, bool eager, bool isNullable) @@ -733,7 +741,10 @@ { CheckAndUpdateSessionStatus(); object result = Factory.GetEntityPersister(entityName).Load(id, null, lockMode, this); - temporaryPersistenceContext.Clear(); + if (temporaryPersistenceContext.IsLoadFinished) + { + temporaryPersistenceContext.Clear(); + } return result; } } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -15,6 +15,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerClassEntity(typeof (TEntity)); + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => { }); + keyMapper = new JoinedSubclassKeyCustomizer<TEntity>(customizersHolder); } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -16,6 +16,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerClassHierarchyEntity(typeof (TEntity)); + + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => { }); } #region ISubclassMapper<TEntity> Members Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -13,6 +13,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerConcreteClassEntity(typeof (TEntity)); + + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => { }); } #region Implementation of IEntityAttributesMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -49,14 +49,19 @@ } if (!string.IsNullOrEmpty(assembly) && string.IsNullOrEmpty(@namespace)) { - return string.Concat(type.Name, ", ", assembly); + return string.Concat(GetTypeNameForMapping(type), ", ", assembly); } if (string.IsNullOrEmpty(assembly) && !string.IsNullOrEmpty(@namespace)) { return type.FullName; } - return type.Name; + return GetTypeNameForMapping(type); } + + private static string GetTypeNameForMapping(System.Type type) + { + return !type.IsGenericType ? type.Name: type.FullName; + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,141 @@ +using System; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode +{ + public class MyEntity + { + + } + public class MyGenericEntity<T> + { + + } + + public class TypeNameUtilTests + { + [Test] + public void WhenTypeNullThenNull() + { + System.Type variableType = null; + variableType.GetShortClassName(new HbmMapping()).Should().Be.Null(); + } + + [Test] + public void WhenMapDocNullThenAssemblyQualifiedName() + { + typeof(MyEntity).GetShortClassName(null).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMapDocHaveDefaultAssemblyThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.FullName; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName); + } + + [Test] + public void WhenMapDocHaveDefaultAssemblyNameThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.GetName().Name; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName); + } + + [Test] + public void WhenMapDocHaveDefaultsThenName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.FullName; + mapDoc.@namespace = typeof(MyEntity).Namespace; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).Name); + } + + [Test] + public void WhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = "whatever"; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly() + { + // strange but possible + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = typeof(MyEntity).Namespace; + typeof(MyEntity).GetShortClassName(mapDoc).Should().StartWith(typeof(MyEntity).Name).And.EndWith(", " + typeof(MyEntity).Assembly.GetName().Name); + } + + [Test] + public void WithGenericWhenMapDocNullThenAssemblyQualifiedName() + { + typeof(MyGenericEntity<int>).GetShortClassName(null).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultAssemblyThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultAssemblyNameThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.GetName().Name; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultsThenName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName; + mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = "whatever"; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly() + { + // strange but possible + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().StartWith(typeof(MyGenericEntity<int>).FullName).And.EndWith(", " + typeof(MyGenericEntity<int>).Assembly.GetName().Name); + } + } +} \ 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-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-23 18:51:34 UTC (rev 5751) @@ -600,6 +600,7 @@ <Compile Include="MappingByCode\NatureDemo\Naturalness\StateProvince.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\User.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\Zoo.cs" /> + <Compile Include="MappingByCode\TypeNameUtilTests.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" /> <Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" /> @@ -814,6 +815,15 @@ <Compile Include="ReadOnly\StudentDto.cs" /> <Compile Include="ReadOnly\TextHolder.cs" /> <Compile Include="ReadOnly\VersionedNode.cs" /> + <Compile Include="Stateless\Contact.cs" /> + <Compile Include="Stateless\Country.cs" /> + <Compile Include="Stateless\FetchingLazyCollections\LazyCollectionFetchTests.cs" /> + <Compile Include="Stateless\Fetching\Resource.cs" /> + <Compile Include="Stateless\Fetching\StatelessSessionFetchingTest.cs" /> + <Compile Include="Stateless\Fetching\Task.cs" /> + <Compile Include="Stateless\Fetching\User.cs" /> + <Compile Include="Stateless\Org.cs" /> + <Compile Include="Stateless\StatelessSessionQueryFixture.cs" /> <Compile Include="Subselect\ClassSubselectFixture.cs" /> <Compile Include="Subselect\Domain.cs" /> <Compile Include="TestCaseMappingByCode.cs" /> @@ -2617,6 +2627,8 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="Stateless\Contact.hbm.xml" /> + <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2660And2661\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DataReaderWrapperTest\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2583\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,34 @@ +namespace NHibernate.Test.Stateless +{ + public class Contact + { + private int id; + private Org org; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + + public virtual Org Org + { + get + { + return org; + } + + set + { + org = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Stateless"> + + <class name="Contact"> + <id name="Id"> + <generator class="native" /> + </id> + <many-to-one name="Org" lazy="false" fetch="join" /> + </class> + + <class name="Org"> + <id name="Id"> + <generator class="native" /> + </id> + <many-to-one name="Country" lazy="false" fetch="join" /> + </class> + + <class name="Country"> + <id name="Id"> + <generator class="native" /> + </id> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,20 @@ +namespace NHibernate.Test.Stateless +{ + public class Country + { + private int id; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Stateless.Fetching"> + <class name="User" table="User_"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Name" /> + </class> + + <class name="Resource"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Name" /> + <many-to-one name="Owner"/> + </class> + + <class name="Task"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Description" /> + <many-to-one name="User" column="user_"/> + <many-to-one name="Resource"/> + <property name="DueDate" /> + <property name="StartDate" /> + <property name="CompletionDate" /> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,59 @@ + +namespace NHibernate.Test.Stateless.Fetching +{ + public class Resource + { + private long? id; + private string name; + private User owner; + + public Resource() + { + } + + public Resource(string name, User owner) + { + this.name = name; + this.owner = owner; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + public virtual string Name + { + get + { + return name; + } + + set + { + this.name = value; + } + } + + public virtual User Owner + { + get + { + return owner; + } + + set + { + this.owner = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,75 @@ +using System; +using System.Collections; +using log4net; +using NUnit.Framework; + +namespace NHibernate.Test.Stateless.Fetching +{ + [TestFixture] + public class StatelessSessionFetchingTest : TestCase + { + private static readonly ILog log = LogManager.GetLogger(typeof(StatelessSessionFetchingTest)); + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get + { + return new[] { "Stateless.Fetching.Mappings.hbm.xml" }; + } + } + + [Test] + public void DynamicFetch() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + DateTime now = DateTime.Now; + User me = new User("me"); + User you = new User("you"); + Resource yourClock = new Resource("clock", you); + Task task = new Task(me, "clean", yourClock, now); // :) + s.Save(me); + s.Save(you); + s.Save(yourClock); + s.Save(task); + tx.Commit(); + } + + using (IStatelessSession ss = sessions.OpenStatelessSession()) + using (ITransaction tx = ss.BeginTransaction()) + { + ss.BeginTransaction(); + Task taskRef = + (Task)ss.CreateQuery("from Task t join fetch t.Resource join fetch t.User").UniqueResult(); + Assert.True(taskRef != null); + Assert.True(NHibernateUtil.IsInitialized(taskRef)); + Assert.True(NHibernateUtil.IsInitialized(taskRef.User)); + Assert.True(NHibernateUtil.IsInitialized(taskRef.Resource)); + Assert.False(NHibernateUtil.IsInitialized(taskRef.Resource.Owner)); + tx.Commit(); + } + + cleanup(); + } + + private void cleanup() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.BeginTransaction(); + s.CreateQuery("delete Task").ExecuteUpdate(); + s.CreateQuery("delete Resource").ExecuteUpdate(); + s.CreateQuery("delete User").ExecuteUpdate(); + tx.Commit(); + } + } + } + +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,134 @@ +using System; + + +namespace NHibernate.Test.Stateless.Fetching +{ + public class Task + { + private long? id; + private string description; + private User user; + private Resource resource; + private DateTime dueDate; + private DateTime? startDate; + private DateTime? completionDate; + + public Task() + { + } + + public Task(User user, string description, Resource resource, DateTime dueDate) + : this(user, description, resource, dueDate, null, null) + { + } + + public Task(User user, string description, Resource resource, DateTime dueDate, DateTime? startDate, DateTime? completionDate) + { + this.user = user; + this.resource = resource; + this.description = description; + this.dueDate = dueDate; + this.startDate = startDate; + this.completionDate = completionDate; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + + public virtual User User + { + get + { + return user; + } + + set + { + this.user = value; + } + } + + + public virtual Resource Resource + { + get + { + return resource; + } + + set + { + this.resource = value; + } + } + + + public virtual string Description + { + get + { + return description; + } + + set + { + this.description = value; + } + } + + + public virtual DateTime DueDate + { + get + { + return dueDate; + } + + set + { + this.dueDate = value; + } + } + + + public virtual DateTime? StartDate + { + get + { + return startDate; + } + + set + { + this.startDate = value; + } + } + + + public virtual DateTime? CompletionDate + { + get + { + return completionDate; + } + + set + { + this.completionDate = value; + } + } + + } + +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,45 @@ + +namespace NHibernate.Test.Stateless.Fetching +{ + public class User + { + private long? id; + private string name; + + public User() + { + } + + public User(string name) + { + this.name = name; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + public virtual string Name + { + get + { + return name; + } + + set + { + this.name = value; + } + } + + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using Iesi.Collections.Generic; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Conformist; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.Stateless.FetchingLazyCollections +{ + public class LazyCollectionFetchTests : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.BeforeMapClass += (mi, t, cm) => cm.Id(im => im.Generator(Generators.HighLow)); + mapper.Class<Animal>(mc => + { + mc.Id(x => x.Id); + mc.Discriminator(dm => dm.Column("kind")); + mc.Property(x => x.Description); + }); + mapper.Subclass<Reptile>(mc => { mc.Property(x => x.BodyTemperature); }); + mapper.Subclass<Human>(mc => + { + mc.Property(x => x.Name); + mc.Property(x => x.NickName); + mc.Property(x => x.Birthdate, pm => pm.Type(NHibernateUtil.Date)); + }); + mapper.AddMapping<FamilyMap<Reptile>>(); + mapper.AddMapping<FamilyMap<Human>>(); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + #region Nested type: FamilyMap + + private class FamilyMap<T> : ClassMapping<Family<T>> where T : Animal + { + public FamilyMap() + { + string familyOf = typeof (T).Name; + + Id(x => x.Id); + EntityName(familyOf + "Family"); + Table("Families"); + Discriminator(dm => dm.Column("familyKind")); + DiscriminatorValue(familyOf); + Where(string.Format("familyKind = '{0}'", familyOf)); + ManyToOne(x => x.Father, map => + { + map.Lazy(LazyRelation.NoLazy); + map.Class(typeof (T)); + map.Cascade(Mapping.ByCode.Cascade.All); + }); + ManyToOne(x => x.Mother, map => + { + map.Lazy(LazyRelation.NoLazy); + map.Class(typeof (T)); + map.Cascade(Mapping.ByCode.Cascade.All); + }); + Set(x => x.Childs, cam => + { + cam.Key(km => km.Column("familyId")); + cam.Cascade(Mapping.ByCode.Cascade.All); + }, + rel => rel.OneToMany()); + } + } + + #endregion + + [Test] + public void ShouldWorkLoadingComplexEntities() + { + const string crocodileFather = "Crocodile father"; + const string crocodileMother = "Crocodile mother"; + + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var rf = new Reptile { Description = crocodileFather }; + var rm = new Reptile { Description = crocodileMother }; + var rc1 = new Reptile { Description = "Crocodile" }; + var rc2 = new Reptile { Description = "Crocodile" }; + var rfamily = new Family<Reptile> + { + Father = rf, + Mother = rm, + Childs = new HashedSet<Reptile> { rc1, rc2 } + }; + s.Save("ReptileFamily", rfamily); + tx.Commit(); + } + + const string humanFather = "Fred"; + const string humanMother = "Wilma"; + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var hf = new Human { Description = "Flinstone", Name = humanFather }; + var hm = new Human { Description = "Flinstone", Name = humanMother }; + var hc1 = new Human { Description = "Flinstone", Name = "Pebbles" }; + var hfamily = new Family<Human> + { + Father = hf, + Mother = hm, + Childs = new HashedSet<Human> { hc1 } + }; + s.Save("HumanFamily", hfamily); + tx.Commit(); + } + + using (IStatelessSession s = sessions.OpenStatelessSession()) + using (ITransaction tx = s.BeginTransaction()) + { + IList<Family<Human>> hf = s.CreateQuery("from HumanFamily").List<Family<Human>>(); + Assert.That(hf.Count, Is.EqualTo(1)); + Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather)); + Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother)); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False(); + + IList<Family<Reptile>> rf = s.CreateQuery("from ReptileFamily").List<Family<Reptile>>(); + Assert.That(rf.Count, Is.EqualTo(1)); + Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather)); + Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother)); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False(); + + tx.Commit(); + } + + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from HumanFamily"); + s.Delete("from ReptileFamily"); + tx.Commit(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -5,7 +5,7 @@ { public abstract class Animal { - public virtual int Id { get; private set; } + public virtual int Id { get; protected set; } public virtual string Description { get; set; } } @@ -25,7 +25,7 @@ { private ISet<T> childs; - public virtual int Id { get; private set; } + public virtual int Id { get; protected set; } public virtual T Father { get; set; } public virtual T Mother { get; set; } public virtual ISet<T> Childs Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,34 @@ +namespace NHibernate.Test.Stateless +{ + public class Org + { + private int id; + private Country country; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + + public virtual Country Country + { + get + { + return country; + } + + set + { + country = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,118 @@ +using System.Collections; +using NHibernate.Cfg; +using NUnit.Framework; + +namespace NHibernate.Test.Stateless +{ + [TestFixture] + public class StatelessSessionQueryFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] {"Stateless.Contact.hbm.xml"}; } + } + + protected override void Configure(Configuration configuration) + { + base.Configure(configuration); + cfg.SetProperty(Environment.MaxFetchDepth, 1.ToString()); + } + + private class TestData + { + internal readonly IList list = new ArrayList(); + + private readonly ISessionFactory sessions; + + public TestData(ISessionFactory sessions) + { + this.sessions = sessions; + } + + public virtual void createData() + { + using (ISession session = sessions.OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + var usa = new Country(); + session.Save(usa); + list.Add(usa); + var disney = new Org(); + disney.Country = usa; + session.Save(disney); + list.Add(disney); + var waltDisney = new Contact(); + waltDisney.Org = disney; + session.Save(waltDisney); + list.Add(waltDisney); + tx.Commit(); + } + } + } + + public virtual void cleanData() + { + using (ISession session = sessions.OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + foreach (object obj in list) + { + session.Delete(obj); + } + + tx.Commit(); + } + } + } + } + + [Test] + public void Criteria() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateCriteria<Contact>().List().Count); + } + + testData.cleanData(); + } + + [Test] + public void CriteriaWithSelectFetchMode() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateCriteria<Contact>().SetFetchMode("Org", FetchMode.Select).List().Count); + } + + testData.cleanData(); + } + + [Test] + public void Hql() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateQuery("from Contact c join fetch c.Org join fetch c.Org.Country").List<Contact>().Count); + } + + testData.cleanData(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -2,6 +2,7 @@ using Iesi.Collections.Generic; using NUnit.Framework; using System.Collections.Generic; +using SharpTestsEx; namespace NHibernate.Test.Stateless { @@ -66,13 +67,15 @@ Assert.That(hf.Count, Is.EqualTo(1)); Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather)); Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother)); - Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True(); + //Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); IList<Family<Reptile>> rf = s.CreateQuery("from ReptilesFamily").List<Family<Reptile>>(); Assert.That(rf.Count, Is.EqualTo(1)); Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather)); Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother)); - Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True(); + //Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); tx.Commit(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 21:50:36
|
Revision: 5750 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5750&view=rev Author: fabiomaulo Date: 2011-04-22 21:50:29 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Tests for NH-2660 and NH-2661 Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/DomainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/DomainClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/DomainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/DomainClass.cs 2011-04-22 21:50:29 UTC (rev 5750) @@ -0,0 +1,12 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2660And2661 +{ + public class DomainClass + { + private int id; + private DateTime data; + public int Id { get { return id; } set { id = value; } } + public DateTime Data { get { return data; } set { data = value; } } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Mappings.hbm.xml 2011-04-22 21:50:29 UTC (rev 5750) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2660And2661" default-access="field.camelcase" + default-lazy="false"> + <class name="DomainClass"> + <id name="Id"> + <generator class="assigned" /> + </id> + <property name="Data" type="Time" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs 2011-04-22 21:50:29 UTC (rev 5750) @@ -0,0 +1,50 @@ +using System; +using NHibernate.Dialect; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2660And2661 +{ + [TestFixture] + public class Test : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + using (ISession session = OpenSession()) + { + DomainClass entity = new DomainClass { Id = 1, Data = DateTime.Parse("10:00") }; + session.Save(entity); + session.Flush(); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + using (ISession session = OpenSession()) + { + session.CreateQuery("delete from DomainClass").ExecuteUpdate(); + session.Flush(); + } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2008Dialect; + } + + [Test, Ignore("workaround to sqlserver DP, not fixed yet")] + public void ShouldBeAbleToQueryEntity() + { + using (ISession session = OpenSession()) + { + var query = + session.CreateQuery( + @"from DomainClass entity where Data = :data"); + query.SetParameter("data", DateTime.Parse("10:00"), NHibernateUtil.Time); + query.Executing(x=> x.List()).NotThrows(); + } + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 19:01:38 UTC (rev 5749) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 21:50:29 UTC (rev 5750) @@ -783,6 +783,8 @@ <Compile Include="NHSpecificTest\NH2603\Model.cs" /> <Compile Include="NHSpecificTest\NH2632\Domain.cs" /> <Compile Include="NHSpecificTest\NH2632\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2660And2661\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH2660And2661\Test.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2615,6 +2617,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2660And2661\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DataReaderWrapperTest\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2583\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\SqlConverterAndMultiQuery\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 19:01:44
|
Revision: 5749 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5749&view=rev Author: fabiomaulo Date: 2011-04-22 19:01:38 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 19:01:38 UTC (rev 5749) @@ -5,7 +5,7 @@ namespace NHibernate.Mapping.ByCode.Impl { - public class DynamicComponentMapper : AbstractPropertyContainerMapper, IDynamicComponentMapper + public class DynamicComponentMapper : IDynamicComponentMapper { private readonly HbmDynamicComponent component; private readonly IAccessorPropertyMapper accessorPropertyMapper; @@ -14,13 +14,22 @@ : this(component, declaringTypeMember, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) {} private DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc) - : base(declaringTypeMember.DeclaringType, mapDoc) { + if (mapDoc == null) + { + throw new ArgumentNullException("mapDoc"); + } + Container = declaringTypeMember.DeclaringType; + MapDoc = mapDoc; + this.component = component; accessorPropertyMapper = accessorMapper; } - protected override void AddProperty(object property) + private System.Type Container { get; set; } + private HbmMapping MapDoc { get; set; } + + protected void AddProperty(object property) { if (property == null) { @@ -30,7 +39,7 @@ component.Items = component.Items == null ? toAdd : component.Items.Concat(toAdd).ToArray(); } - public override void Property(MemberInfo property, Action<IPropertyMapper> mapping) + public void Property(MemberInfo property, Action<IPropertyMapper> mapping) { var hbmProperty = new HbmProperty { @@ -42,99 +51,94 @@ AddProperty(hbmProperty); } - public override void Component(MemberInfo property, Action<IComponentMapper> mapping) + public void Component(MemberInfo property, Action<IComponentMapper> mapping) { var hbm = new HbmComponent { name = property.Name }; mapping(new ComponentMapper(hbm, property.GetPropertyOrFieldType(), new NoMemberPropertyMapper(), MapDoc)); AddProperty(hbm); } - public override void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping) + public void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping) { var hbm = new HbmDynamicComponent { name = property.Name }; mapping(new DynamicComponentMapper(hbm, property, new NoMemberPropertyMapper(), MapDoc)); AddProperty(hbm); } - public override void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) { var hbm = new HbmManyToOne { name = property.Name }; mapping(new ManyToOneMapper(property, new NoMemberPropertyMapper(), hbm, MapDoc)); AddProperty(hbm); } - public override void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + public void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) { var hbm = new HbmAny { name = property.Name }; mapping(new AnyMapper(property, idTypeOfMetaType, new NoMemberPropertyMapper(), hbm, MapDoc)); AddProperty(hbm); } - public override void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping) + public void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping) { var hbm = new HbmOneToOne { name = property.Name }; mapping(new OneToOneMapper(property, new NoMemberPropertyMapper(), hbm)); AddProperty(hbm); } - public override void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmBag { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); System.Type collectionElementType = propertyType.DetermineCollectionElementType(); - collectionMapping(new BagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + collectionMapping(new BagMapper(Container, collectionElementType, new NoMemberPropertyMapper(), hbm)); mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); AddProperty(hbm); } - public override void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmSet { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); System.Type collectionElementType = propertyType.DetermineCollectionElementType(); - collectionMapping(new SetMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + collectionMapping(new SetMapper(Container, collectionElementType, new NoMemberPropertyMapper(), hbm)); mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); AddProperty(hbm); } - public override void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmList { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); System.Type collectionElementType = propertyType.DetermineCollectionElementType(); - collectionMapping(new ListMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + collectionMapping(new ListMapper(Container, collectionElementType, new NoMemberPropertyMapper(), hbm)); mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item1 = rel)); AddProperty(hbm); } - public override void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping) + public void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmMap { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType(); System.Type dictionaryValueType = propertyType.DetermineDictionaryValueType(); - collectionMapping(new MapMapper(container, dictionaryKeyType, dictionaryValueType, new NoMemberPropertyMapper(), hbm, mapDoc)); - keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, mapDoc)); + collectionMapping(new MapMapper(Container, dictionaryKeyType, dictionaryValueType, new NoMemberPropertyMapper(), hbm, MapDoc)); + keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, MapDoc)); mapping(new CollectionElementRelation(dictionaryValueType, MapDoc, rel => hbm.Item1 = rel)); AddProperty(hbm); } - public override void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmIdbag { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); System.Type collectionElementType = propertyType.DetermineCollectionElementType(); - collectionMapping(new IdBagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + collectionMapping(new IdBagMapper(Container, collectionElementType, new NoMemberPropertyMapper(), hbm)); mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); AddProperty(hbm); } - protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) - { - return true; - } - public void Access(Accessor accessor) { accessorPropertyMapper.Access(accessor); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:54:36
|
Revision: 5748 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5748&view=rev Author: fabiomaulo Date: 2011-04-22 18:54:29 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add idbag property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -61,7 +61,7 @@ AddProperty(hbm); } - public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public virtual void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmIdbag { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -120,6 +120,16 @@ AddProperty(hbm); } + public override void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmIdbag { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new IdBagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -16,6 +16,9 @@ private readonly CollectionIdMapper idMapper; public IdBagMapper(System.Type ownerType, System.Type elementType, HbmIdbag mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public IdBagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmIdbag mapping) { if (ownerType == null) { @@ -42,7 +45,7 @@ mapping.collectionid = new HbmCollectionId(); } idMapper = new CollectionIdMapper(mapping.collectionid); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class IdBagPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.IdBag(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.IdBag(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.IdBag(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmIdbag>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:54:29 UTC (rev 5748) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\IdBagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:40:17
|
Revision: 5747 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5747&view=rev Author: fabiomaulo Date: 2011-04-22 18:40:11 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add map property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -107,6 +107,19 @@ AddProperty(hbm); } + public override void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmMap { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType(); + System.Type dictionaryValueType = propertyType.DetermineDictionaryValueType(); + + collectionMapping(new MapMapper(container, dictionaryKeyType, dictionaryValueType, new NoMemberPropertyMapper(), hbm, mapDoc)); + keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, mapDoc)); + mapping(new CollectionElementRelation(dictionaryValueType, MapDoc, rel => hbm.Item1 = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -16,6 +16,9 @@ private ICacheMapper cacheMapper; public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, HbmMap mapping, HbmMapping mapDoc) + : this(ownerType, keyType, valueType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping, mapDoc) {} + + public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, IAccessorPropertyMapper accessorMapper, HbmMap mapping, HbmMapping mapDoc) { if (ownerType == null) { @@ -52,7 +55,7 @@ { mapping.Item = new HbmMapKeyManyToMany {@class = KeyType.GetShortClassName(mapDoc)}; } - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class MapPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + mapper.Map(propertyInfo, x => { }, km => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Map(propertyInfo, x => called = true, km => { }, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + mapper.Map(propertyInfo, x => x.Access(Accessor.Field), km => { }, rel => { }); + + component.Properties.OfType<HbmMap>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:40:11 UTC (rev 5747) @@ -558,6 +558,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:31:50
|
Revision: 5746 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5746&view=rev Author: fabiomaulo Date: 2011-04-22 18:31:43 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add list property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -97,6 +97,16 @@ AddProperty(hbm); } + public override void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmList { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new ListMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item1 = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -16,6 +16,9 @@ private ICacheMapper cacheMapper; public ListMapper(System.Type ownerType, System.Type elementType, HbmList mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public ListMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmList mapping) { if (ownerType == null) { @@ -40,7 +43,7 @@ var listIndex = new HbmListIndex(); mapping.Item = listIndex; listIndexMapper = new ListIndexMapper(ownerType, listIndex); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class ListPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.List(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.List(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.List(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmList>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:31:43 UTC (rev 5746) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:26:15
|
Revision: 5745 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5745&view=rev Author: fabiomaulo Date: 2011-04-22 18:26:08 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add set property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -87,6 +87,16 @@ AddProperty(hbm); } + public override void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmSet { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new SetMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -15,6 +15,9 @@ private ICacheMapper cacheMapper; public SetMapper(System.Type ownerType, System.Type elementType, HbmSet mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public SetMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmSet mapping) { if (ownerType == null) { @@ -36,7 +39,7 @@ mapping.key = new HbmKey(); } keyMapper = new KeyMapper(ownerType, mapping.Key); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class SetPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Set(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Set(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Set(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmSet>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:26:08 UTC (rev 5745) @@ -558,6 +558,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:20:37
|
Revision: 5744 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5744&view=rev Author: fabiomaulo Date: 2011-04-22 18:20:31 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add bag property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -15,6 +15,9 @@ private ICacheMapper cacheMapper; public BagMapper(System.Type ownerType, System.Type elementType, HbmBag mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public BagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmBag mapping) { if (ownerType == null) { @@ -36,7 +39,7 @@ mapping.key = new HbmKey(); } keyMapper = new KeyMapper(ownerType, mapping.Key); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -77,6 +77,16 @@ AddProperty(hbm); } + public override void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmBag { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new BagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class BagPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Bag(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Bag(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Bag(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmBag>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:20:31 UTC (rev 5744) @@ -552,6 +552,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:10:34
|
Revision: 5743 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5743&view=rev Author: fabiomaulo Date: 2011-04-22 18:10:28 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add one-to-one property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -70,6 +70,13 @@ AddProperty(hbm); } + public override void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping) + { + var hbm = new HbmOneToOne { name = property.Name }; + mapping(new OneToOneMapper(property, new NoMemberPropertyMapper(), hbm)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -11,6 +11,9 @@ private readonly HbmOneToOne oneToOne; public OneToOneMapper(MemberInfo member, HbmOneToOne oneToOne) + : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x), oneToOne) {} + + public OneToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorMapper, HbmOneToOne oneToOne) { this.member = member; this.oneToOne = oneToOne; @@ -18,14 +21,7 @@ { this.oneToOne.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper; } #region Implementation of IOneToOneMapper Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -0,0 +1,67 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class OneToOnePropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Id { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.OneToOne(propertyInfo, x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.OneToOne(propertyInfo, x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.OneToOne(propertyInfo, x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmOneToOne>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:10:28 UTC (rev 5743) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:04:26
|
Revision: 5742 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5742&view=rev Author: fabiomaulo Date: 2011-04-22 18:04:20 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add any property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -84,7 +84,7 @@ AddProperty(hbm); } - public void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + public virtual void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) { if (!IsMemberSupportedByMappedContainer(property)) { Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -20,6 +20,9 @@ private readonly MemberInfo member; public AnyMapper(MemberInfo member, System.Type foreignIdType, HbmAny any, HbmMapping mapDoc) + : this(member, foreignIdType, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x), any, mapDoc) {} + + public AnyMapper(MemberInfo member, System.Type foreignIdType, IAccessorPropertyMapper accessorMapper, HbmAny any, HbmMapping mapDoc) { this.member = member; this.foreignIdType = foreignIdType; @@ -29,14 +32,7 @@ { this.any.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper; if (foreignIdType == null) { throw new ArgumentNullException("foreignIdType"); @@ -53,7 +49,7 @@ var classHbmColumn = new HbmColumn(); string classColumnName = member == null ? DefaultMetaColumnNameWhenNoProperty : member.Name + "Class"; classColumnMapper = new ColumnMapper(classHbmColumn, classColumnName); - any.column = new[] {classHbmColumn, idHbmColumn}; + any.column = new[] { classHbmColumn, idHbmColumn }; } #region Implementation of IAccessorPropertyMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -63,6 +63,13 @@ AddProperty(hbm); } + public override void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + { + var hbm = new HbmAny { name = property.Name }; + mapping(new AnyMapper(property, idTypeOfMetaType, new NoMemberPropertyMapper(), hbm, MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -0,0 +1,63 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class AnyPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + mapper.Any(propertyInfo, typeof(int), x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Any(propertyInfo, typeof(int), x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + mapper.Any(propertyInfo, typeof(int), x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmAny>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:04:20 UTC (rev 5742) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 17:51:29
|
Revision: 5741 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5741&view=rev Author: fabiomaulo Date: 2011-04-22 17:51:22 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add many-to-one property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -56,6 +56,13 @@ AddProperty(hbm); } + public override void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + { + var hbm = new HbmManyToOne { name = property.Name }; + mapping(new ManyToOneMapper(property, new NoMemberPropertyMapper(), hbm, MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -14,6 +14,9 @@ private readonly MemberInfo member; public ManyToOneMapper(MemberInfo member, HbmManyToOne manyToOne, HbmMapping mapDoc) + : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x), manyToOne, mapDoc) {} + + public ManyToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorPropertyMapper, HbmManyToOne manyToOne, HbmMapping mapDoc) { this.member = member; this.manyToOne = manyToOne; @@ -22,14 +25,7 @@ { this.manyToOne.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorPropertyMapper; } #region Implementation of IManyToOneMapper Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -0,0 +1,67 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class ManyToOnePropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Id { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.ManyToOne(propertyInfo, x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.ManyToOne(propertyInfo, x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.ManyToOne(propertyInfo, x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmManyToOne>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:51:22 UTC (rev 5741) @@ -554,6 +554,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 17:38:04
|
Revision: 5740 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5740&view=rev Author: fabiomaulo Date: 2011-04-22 17:37:58 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add dyn-component property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) @@ -10,10 +10,14 @@ private readonly HbmDynamicComponent component; private readonly IAccessorPropertyMapper accessorPropertyMapper; - public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) : base(declaringTypeMember.DeclaringType, mapDoc) + public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) + : this(component, declaringTypeMember, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) {} + + private DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc) + : base(declaringTypeMember.DeclaringType, mapDoc) { this.component = component; - accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x); + accessorPropertyMapper = accessorMapper; } protected override void AddProperty(object property) @@ -45,6 +49,13 @@ AddProperty(hbm); } + public override void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping) + { + var hbm = new HbmDynamicComponent { name = property.Name }; + mapping(new DynamicComponentMapper(hbm, property, new NoMemberPropertyMapper(), MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs 2011-04-22 17:37:58 UTC (rev 5740) @@ -0,0 +1,63 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class DynComponentPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("Info"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + var called = false; + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmDynamicComponent>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 16:11:38 UTC (rev 5739) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:37:58 UTC (rev 5740) @@ -553,6 +553,7 @@ <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 16:11:44
|
Revision: 5739 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5739&view=rev Author: fabiomaulo Date: 2011-04-22 16:11:38 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add component property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -12,11 +12,16 @@ private ComponentParentMapper parentMapper; public ComponentMapper(HbmComponent component, System.Type componentType, MemberInfo declaringTypeMember, HbmMapping mapDoc) + : this(component,componentType, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) + { + } + + public ComponentMapper(HbmComponent component, System.Type componentType, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc) : base(componentType, mapDoc) { this.component = component; component.@class = componentType.GetShortClassName(mapDoc); - accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x); + accessorPropertyMapper = accessorMapper; } #region Overrides of AbstractPropertyContainerMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -38,6 +38,13 @@ AddProperty(hbmProperty); } + public override void Component(MemberInfo property, Action<IComponentMapper> mapping) + { + var hbm = new HbmComponent { name = property.Name }; + mapping(new ComponentMapper(hbm, property.GetPropertyOrFieldType(), new NoMemberPropertyMapper(), MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -0,0 +1,67 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class ComponentPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Something { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.Component(propertyInfo, (IComponentMapper x) => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Component(propertyInfo, (IComponentMapper x) => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.Component(propertyInfo, (IComponentMapper x) => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmComponent>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 16:11:38 UTC (rev 5739) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 15:36:35
|
Revision: 5738 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5738&view=rev Author: fabiomaulo Date: 2011-04-22 15:36:27 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Passing tests to add simple property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SimplePropertyOnDynamicCompoTests.cs Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SimplePropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SimplePropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SimplePropertyOnDynamicCompoTests.cs 2011-04-22 15:36:27 UTC (rev 5738) @@ -0,0 +1,62 @@ +using System.Collections; +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.DynamicComponentMapperTests +{ + public class SimplePropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = 5 }).GetType().GetProperty("A"); + + mapper.Property(propertyInfo, x => { }); + + component.Properties.Select(x=> x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = 5 }).GetType().GetProperty("A"); + var called = false; + mapper.Property(propertyInfo, x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = 5 }).GetType().GetProperty("A"); + + mapper.Property(propertyInfo, x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmProperty>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ 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-22 15:07:29 UTC (rev 5737) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 15:36:27 UTC (rev 5738) @@ -552,6 +552,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\SetPersisterTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 15:07:36
|
Revision: 5737 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5737&view=rev Author: fabiomaulo Date: 2011-04-22 15:07:29 +0000 (Fri, 22 Apr 2011) Log Message: ----------- DynamicComponentMapper set property type by default and ignore accessor setting Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -26,6 +26,18 @@ component.Items = component.Items == null ? toAdd : component.Items.Concat(toAdd).ToArray(); } + public override void Property(MemberInfo property, Action<IPropertyMapper> mapping) + { + var hbmProperty = new HbmProperty + { + name = property.Name, + type1 = property.GetPropertyOrFieldType().GetNhTypeName() + }; + + mapping(new PropertyMapper(property, hbmProperty, new NoMemberPropertyMapper())); + AddProperty(hbmProperty); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -14,6 +14,21 @@ private readonly MemberInfo member; private readonly HbmProperty propertyMapping; + public PropertyMapper(MemberInfo member, HbmProperty propertyMapping, IAccessorPropertyMapper accessorMapper) + { + if (propertyMapping == null) + { + throw new ArgumentNullException("propertyMapping"); + } + this.member = member; + this.propertyMapping = propertyMapping; + if (member == null) + { + this.propertyMapping.access = "none"; + } + entityPropertyMapper = accessorMapper; + } + public PropertyMapper(MemberInfo member, HbmProperty propertyMapping) { if (propertyMapping == null) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -32,5 +32,21 @@ hbmDynamicComponent.Should().Not.Be.Null(); hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate"); } + + [Test] + public void WhenMapDynCompoPropertiesThenShouldAssignPropertyType() + { + var mapper = new ModelMapper(); + mapper.Class<Person>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Component(x => x.Info, new { MyInt = 5, MyDate = DateTime.Now }, z => { }); + }); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().Single(); + hbmDynamicComponent.Properties.OfType<HbmProperty>().Select(x => x.type1).All(x=> x.Satisfy(value=> !string.IsNullOrEmpty(value))); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -0,0 +1,458 @@ +using System; +using System.Linq; +using System.Data; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Engine; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NHibernate.Properties; +using NHibernate.SqlTypes; +using NHibernate.Type; +using NHibernate.UserTypes; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class PropertyMapperTest + { + private enum MyEnum + { + One + } + private class MyClass + { + public string Autoproperty { get; set; } + public string ReadOnly { get { return ""; } } + public MyEnum EnumProp { get; set; } + } + + private class MyAccessorMapper : IAccessorPropertyMapper + { + public bool AccessorCalled { get; set; } + public void Access(Accessor accessor) + { + AccessorCalled = true; + } + + public void Access(System.Type accessorType) + { + + } + } + [Test] + public void WhenCreateWithGivenAccessorMapperThenUseTheGivenAccessoMapper() + { + var member = typeof (MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var myAccessorMapper = new MyAccessorMapper(); + var mapper = new PropertyMapper(member, mapping, myAccessorMapper); + mapper.Access(Accessor.Field); + myAccessorMapper.AccessorCalled.Should().Be.True(); + } + + [Test] + public void WhenSettingByTypeThenCheckCompatibility() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + Executing.This(() => mapper.Access(typeof(object))).Should().Throw<ArgumentOutOfRangeException>(); + Executing.This(() => mapper.Access(typeof(FieldAccessor))).Should().NotThrow(); + mapping.Access.Should().Be.EqualTo(typeof(FieldAccessor).AssemblyQualifiedName); + } + + [Test] + public void WhenSetTypeByITypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type(NHibernateUtil.String); + + mapping.Type.name.Should().Be.EqualTo("String"); + } + + [Test] + public void WhenSetTypeByIUserTypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(); + + mapping.Type.name.Should().Contain("MyType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByICompositeUserTypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyCompoType>(); + + mapping.Type.name.Should().Contain("MyCompoType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByIUserTypeWithParamsThenSetType() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(new { Param1 = "a", Param2 = 12 }); + + mapping.type1.Should().Be.Null(); + mapping.Type.name.Should().Contain("MyType"); + mapping.Type.param.Should().Have.Count.EqualTo(2); + mapping.Type.param.Select(p => p.name).Should().Have.SameValuesAs("Param1", "Param2"); + mapping.Type.param.Select(p => p.GetText()).Should().Have.SameValuesAs("a", "12"); + } + + [Test] + public void WhenSetTypeByIUserTypeWithNullParamsThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(null); + + mapping.Type.name.Should().Contain("MyType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByITypeTypeThenSetType() + { + var member = For<MyClass>.Property(c => c.EnumProp); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<EnumStringType<MyEnum>>(); + + mapping.Type.name.Should().Contain(typeof(EnumStringType<MyEnum>).FullName); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetInvalidTypeThenThrow() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + Executing.This(() => mapper.Type(typeof(object), null)).Should().Throw<ArgumentOutOfRangeException>(); + Executing.This(() => mapper.Type(null, null)).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenSetDifferentColumnNameThenSetTheName() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => cm.Name("pepe")); + + mapping.Columns.Should().Have.Count.EqualTo(1); + mapping.Columns.Single().name.Should().Be("pepe"); + } + + [Test] + public void WhenSetDefaultColumnNameThenDoesNotSetTheName() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => { cm.Name("Autoproperty"); cm.Length(50); }); + mapping.column.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.Columns.Should().Be.Empty(); + } + + [Test] + public void WhenSetBasicColumnValuesThenSetPlainValues() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => + { + cm.Length(50); + cm.NotNullable(true); + }); + mapping.Items.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.notnull.Should().Be(true); + mapping.notnullSpecified.Should().Be(true); + } + + [Test] + public void WhenSetColumnValuesThenAddColumnTag() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => + { + cm.SqlType("VARCHAR(50)"); + cm.NotNullable(true); + }); + mapping.Items.Should().Not.Be.Null(); + mapping.Columns.Should().Have.Count.EqualTo(1); + } + + [Test] + public void WhenSetBasicColumnValuesMoreThanOnesThenMergeColumn() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => cm.Length(50)); + mapper.Column(cm => cm.NotNullable(true)); + + mapping.Items.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.notnull.Should().Be(true); + mapping.notnullSpecified.Should().Be(true); + } + + [Test] + public void WhenSetMultiColumnsValuesThenAddColumns() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(); + mapper.Columns(cm => + { + cm.Name("column1"); + cm.Length(50); + }, cm => + { + cm.Name("column2"); + cm.SqlType("VARCHAR(10)"); + }); + mapping.Columns.Should().Have.Count.EqualTo(2); + } + + [Test] + public void WhenSetMultiColumnsValuesThenAutoassignColumnNames() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)")); + mapping.Columns.Should().Have.Count.EqualTo(2); + mapping.Columns.All(cm => cm.name.Satisfy(n => !string.IsNullOrEmpty(n))); + } + + [Test] + public void AfterSetMultiColumnsCantSetSimpleColumn() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)")); + Executing.This(() => mapper.Column(cm => cm.Length(50))).Should().Throw<MappingException>(); + } + + [Test] + public void WhenSetBasicColumnValuesThroughShortCutThenMergeColumn() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column("pizza"); + mapper.Length(50); + mapper.Precision(10); + mapper.Scale(2); + mapper.NotNullable(true); + mapper.Unique(true); + mapper.UniqueKey("AA"); + mapper.Index("II"); + + mapping.Items.Should().Be.Null(); + mapping.column.Should().Be("pizza"); + mapping.length.Should().Be("50"); + mapping.precision.Should().Be("10"); + mapping.scale.Should().Be("2"); + mapping.notnull.Should().Be(true); + mapping.unique.Should().Be(true); + mapping.uniquekey.Should().Be("AA"); + mapping.index.Should().Be("II"); + } + + [Test] + public void WhenSetUpdateThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Update(false); + mapping.update.Should().Be.False(); + mapping.updateSpecified.Should().Be.True(); + } + + [Test] + public void WhenSetInsertThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Insert(false); + mapping.insert.Should().Be.False(); + mapping.insertSpecified.Should().Be.True(); + } + + [Test] + public void WhenSetLazyThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Lazy(true); + mapping.lazy.Should().Be.True(); + mapping.IsLazyProperty.Should().Be.True(); + } + } + + public class MyType : IUserType + { + #region Implementation of IUserType + + public bool Equals(object x, object y) + { + throw new NotImplementedException(); + } + + public int GetHashCode(object x) + { + throw new NotImplementedException(); + } + + public object NullSafeGet(IDataReader rs, string[] names, object owner) + { + throw new NotImplementedException(); + } + + public void NullSafeSet(IDbCommand cmd, object value, int index) + { + throw new NotImplementedException(); + } + + public object DeepCopy(object value) + { + throw new NotImplementedException(); + } + + public object Replace(object original, object target, object owner) + { + throw new NotImplementedException(); + } + + public object Assemble(object cached, object owner) + { + throw new NotImplementedException(); + } + + public object Disassemble(object value) + { + throw new NotImplementedException(); + } + + public SqlType[] SqlTypes + { + get { throw new NotImplementedException(); } + } + + public System.Type ReturnedType + { + get { throw new NotImplementedException(); } + } + + public bool IsMutable + { + get { throw new NotImplementedException(); } + } + + #endregion + } + + public class MyCompoType : ICompositeUserType + { + public object GetPropertyValue(object component, int property) + { + throw new NotImplementedException(); + } + + public void SetPropertyValue(object component, int property, object value) + { + throw new NotImplementedException(); + } + + public bool Equals(object x, object y) + { + throw new NotImplementedException(); + } + + public int GetHashCode(object x) + { + throw new NotImplementedException(); + } + + public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session) + { + throw new NotImplementedException(); + } + + public object DeepCopy(object value) + { + throw new NotImplementedException(); + } + + public object Disassemble(object value, ISessionImplementor session) + { + throw new NotImplementedException(); + } + + public object Assemble(object cached, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public object Replace(object original, object target, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public string[] PropertyNames + { + get { throw new NotImplementedException(); } + } + + public IType[] PropertyTypes + { + get { throw new NotImplementedException(); } + } + + public System.Type ReturnedClass + { + get { throw new NotImplementedException(); } + } + + public bool IsMutable + { + get { throw new NotImplementedException(); } + } + } +} \ 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-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 15:07:29 UTC (rev 5737) @@ -557,6 +557,7 @@ <Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\JoinMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\PropertyMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperWithJoinPropertiesTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 14:14:33
|
Revision: 5736 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5736&view=rev Author: fabiomaulo Date: 2011-04-22 14:14:26 +0000 (Fri, 22 Apr 2011) Log Message: ----------- dynamic-component mapping first try 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/IModelInspector.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -21,6 +21,8 @@ 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> dynamicComponents = new HashSet<MemberInfo>(); + private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); 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>(); @@ -135,6 +137,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -404,6 +411,13 @@ splitDefinitions.Add(definition); } + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + persistentMembers.Add(member); + dynamicComponents.Add(member); + dynamicComponentTemplates[member] = componentTemplate; + } + private void AddTypeSplits(System.Type propertyContainer, string splitGroupId) { HashSet<string> splitsGroupsIds; @@ -538,6 +552,18 @@ return properties.Contains(member); } + public bool IsDynamicComponent(MemberInfo member) + { + return dynamicComponents.Contains(member); + } + + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + System.Type template; + dynamicComponentTemplates.TryGetValue(member, out template); + return template ?? typeof(object); + } + public IEnumerable<string> GetPropertiesSplits(System.Type type) { return GetSplitGroupsFor(type); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -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> dynamicComponents = 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>(); @@ -138,6 +139,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -158,6 +164,11 @@ return null; } + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + return typeof(object); + } + public void AddAsRootEntity(System.Type type) {} public void AddAsComponent(System.Type type) {} @@ -201,7 +212,7 @@ public void AddAsProperty(MemberInfo member) {} public void AddAsPersistentMember(MemberInfo member){} public void AddAsPropertySplit(SplitDefinition definition) {} - + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) {} #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -42,11 +42,13 @@ IEnumerable<MemberInfo> Arrays { get; } IEnumerable<MemberInfo> Dictionaries { get; } IEnumerable<MemberInfo> Properties { get; } + IEnumerable<MemberInfo> DynamicComponents { get; } IEnumerable<MemberInfo> PersistentMembers { get; } IEnumerable<SplitDefinition> SplitDefinitions { get; } IEnumerable<string> GetSplitGroupsFor(System.Type type); string GetSplitGroupFor(MemberInfo member); + System.Type GetDynamicComponentTemplate(MemberInfo member); void AddAsRootEntity(System.Type type); void AddAsComponent(System.Type type); @@ -73,5 +75,6 @@ void AddAsProperty(MemberInfo member); void AddAsPersistentMember(MemberInfo member); void AddAsPropertySplit(SplitDefinition definition); + void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -33,6 +33,8 @@ bool IsArray(MemberInfo role); bool IsDictionary(MemberInfo role); bool IsProperty(MemberInfo member); + bool IsDynamicComponent(MemberInfo member); + System.Type GetDynamicComponentTemplate(MemberInfo member); IEnumerable<string> GetPropertiesSplits(System.Type type); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -33,6 +33,9 @@ private readonly Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>> componentPropertyCustomizers = new Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>> dynamicComponentCustomizers = + new Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>>(); + private readonly Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>> joinedClassCustomizers = new Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>>(); @@ -159,6 +162,11 @@ AddCustomizer(componentPropertyCustomizers, member, propertyCustomizer); } + public void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer) + { + AddCustomizer(dynamicComponentCustomizers, member, propertyCustomizer); + } + public void AddCustomizer(PropertyPath member, Action<IManyToManyMapper> collectionRelationManyToManyCustomizer) { AddCustomizer(collectionRelationManyToManyCustomizers, member, collectionRelationManyToManyCustomizer); @@ -274,6 +282,11 @@ InvokeCustomizers(componentPropertyCustomizers, member, mapper); } + public void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper) + { + InvokeCustomizers(dynamicComponentCustomizers, member, mapper); + } + public void InvokeCustomizers(PropertyPath member, IManyToManyMapper mapper) { InvokeCustomizers(collectionRelationManyToManyCustomizers, member, mapper); Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -0,0 +1,50 @@ +using System; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class DynamicComponentCustomizer<TComponent> : PropertyContainerCustomizer<TComponent>, IDynamicComponentMapper<TComponent> where TComponent : class + { + public DynamicComponentCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder, PropertyPath propertyPath) + : base(explicitDeclarationsHolder, customizersHolder, propertyPath) + { + if (propertyPath == null) + { + throw new ArgumentNullException("propertyPath"); + } + if (explicitDeclarationsHolder == null) + { + throw new ArgumentNullException("explicitDeclarationsHolder"); + } + explicitDeclarationsHolder.AddAsDynamicComponent(propertyPath.LocalMember, typeof(TComponent)); + } + + #region IDynamicComponentMapper<TComponent> Members + + public void Access(Accessor accessor) + { + throw new NotImplementedException(); + } + + public void Access(System.Type accessorType) + { + throw new NotImplementedException(); + } + + public void OptimisticLock(bool takeInConsiderationForOptimisticLock) + { + throw new NotImplementedException(); + } + + public void Update(bool consideredInUpdateQuery) + { + throw new NotImplementedException(); + } + + public void Insert(bool consideredInInsertQuery) + { + throw new NotImplementedException(); + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -83,9 +83,17 @@ TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class { - throw new NotImplementedException(); + RegisterDynamicComponentMapping(property, mapping); } + protected virtual void RegisterDynamicComponentMapping<TComponent>(Expression<Func<TEntity, IDictionary>> property, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); + MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); + mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf))); + } + public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class { Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -23,7 +23,7 @@ public IEnumerable<MemberInfo> GetRootEntityMembers(System.Type entityClass) { - return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } public IEnumerable<MemberInfo> GetSubEntityMembers(System.Type entityClass, System.Type entitySuperclass) @@ -35,17 +35,23 @@ { IEnumerable<MemberInfo> propertiesOfSubclass = GetCandidatePersistentProperties(entityClass, flattenHierarchyBindingFlag); IEnumerable<MemberInfo> propertiesOfBaseClass = GetCandidatePersistentProperties(entitySuperclass, flattenHierarchyBindingFlag); - return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } else { - return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } } + protected IEnumerable<FieldInfo> GetUserDeclaredFields(System.Type type) + { + // can't find another way to exclude fields generated by the compiler (for both auto-properties and anonymous-types) + return type.GetFields(ClassFieldsBindingFlags).Where(x=> !x.Name.StartsWith("<")); + } + public IEnumerable<MemberInfo> GetComponentMembers(System.Type componentClass) { - return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(componentClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(GetUserDeclaredFields(componentClass).Cast<MemberInfo>()); } #endregion @@ -55,7 +61,7 @@ System.Type analizing = type; while (analizing != null && analizing != typeof (object)) { - foreach (FieldInfo fieldInfo in analizing.GetFields(ClassFieldsBindingFlags)) + foreach (FieldInfo fieldInfo in GetUserDeclaredFields(analizing)) { yield return fieldInfo; } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -21,6 +20,8 @@ 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> dynamicComponents = new HashSet<MemberInfo>(); + private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); 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>(); @@ -132,6 +133,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -152,6 +158,13 @@ return null; } + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + System.Type template; + dynamicComponentTemplates.TryGetValue(member, out template); + return template ?? typeof(object); + } + public void AddAsRootEntity(System.Type type) { rootEntities.Add(type); @@ -262,6 +275,12 @@ splitDefinitions.Add(definition); } + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + dynamicComponents.Add(member); + dynamicComponentTemplates[member] = componentTemplate; + } + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -24,6 +24,7 @@ void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer); + void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer); void InvokeCustomizers(System.Type type, IClassMapper mapper); void InvokeCustomizers(System.Type type, ISubclassMapper mapper); @@ -43,6 +44,7 @@ void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper); + void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper); #region Collection Element relations invokers Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -36,6 +36,11 @@ System.Array.ForEach(source.Properties.ToArray(), destination.AddAsProperty); System.Array.ForEach(source.PersistentMembers.ToArray(), destination.AddAsPersistentMember); System.Array.ForEach(source.SplitDefinitions.ToArray(), destination.AddAsPropertySplit); + foreach (var dynamicComponent in source.DynamicComponents) + { + var template = source.GetDynamicComponentTemplate(dynamicComponent); + destination.AddAsDynamicComponent(dynamicComponent, template); + } } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -903,6 +903,10 @@ { MapOneToOne(member, memberPath, propertiesContainer); } + else if (modelInspector.IsDynamicComponent(property)) + { + MapDynamicComponent(member, memberPath, propertyType, propertiesContainer); + } else if (modelInspector.IsSet(property)) { MapSet(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); @@ -938,6 +942,19 @@ } } + private void MapDynamicComponent(MemberInfo member, PropertyPath memberPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer) + { + propertiesContainer.Component(member, (IDynamicComponentMapper componentMapper) => + { + System.Type componentType = modelInspector.GetDynamicComponentTemplate(member); + IEnumerable<MemberInfo> persistentProperties = membersProvider.GetComponentMembers(componentType); + + ForEachMemberPath(member, memberPath, pp => customizerHolder.InvokeCustomizers(pp, componentMapper)); + + MapProperties(propertyType, persistentProperties, componentMapper, memberPath); + }); + } + private void MapAny(MemberInfo member, PropertyPath memberPath, IBasePlainPropertyContainerMapper propertiesContainer) { propertiesContainer.Any(member, typeof (int), anyMapper => Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -27,6 +27,7 @@ private Func<MemberInfo, bool, bool> isVersion = (m, declared) => declared; private Func<MemberInfo, bool, bool> isProperty = (m, declared) => declared; + private Func<MemberInfo, bool, bool> isDynamicComponent = (m, declared) => declared; private Func<MemberInfo, bool, bool> isAny = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToMany = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToOne; @@ -341,6 +342,11 @@ get { return declaredModel.SplitDefinitions; } } + IEnumerable<MemberInfo> IModelExplicitDeclarationsHolder.DynamicComponents + { + get { return declaredModel.DynamicComponents; } + } + IEnumerable<string> IModelExplicitDeclarationsHolder.GetSplitGroupsFor(System.Type type) { return declaredModel.GetSplitGroupsFor(type); @@ -461,6 +467,11 @@ declaredModel.AddAsPropertySplit(definition); } + void IModelExplicitDeclarationsHolder.AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + declaredModel.AddAsDynamicComponent(member, componentTemplate); + } + #endregion #region Implementation of IModelInspector @@ -603,6 +614,21 @@ return isProperty(member, declaredResult); } + bool IModelInspector.IsDynamicComponent(MemberInfo member) + { + bool declaredResult = declaredModel.IsDynamicComponent(member); + return isDynamicComponent(member, declaredResult); + } + + System.Type IModelInspector.GetDynamicComponentTemplate(MemberInfo member) + { + return declaredModel.GetDynamicComponentTemplate(member); + } + System.Type IModelExplicitDeclarationsHolder.GetDynamicComponentTemplate(MemberInfo member) + { + return declaredModel.GetDynamicComponentTemplate(member); + } + IEnumerable<string> IModelInspector.GetPropertiesSplits(System.Type type) { IEnumerable<string> declaredResult = declaredModel.GetPropertiesSplits(type); @@ -826,5 +852,14 @@ } isTablePerClassSplit = match; } + + public void IsDynamicComponent(Func<MemberInfo, bool, bool> match) + { + if (match == null) + { + return; + } + isDynamicComponent = match; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 14:14:26 UTC (rev 5736) @@ -295,6 +295,7 @@ <Compile Include="Mapping\ByCode\Conformist\SubclassMapping.cs" /> <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> <Compile Include="Mapping\ByCode\PropertyToField.cs" /> <Compile Include="Mapping\ByCode\SimpleModelInspector.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class DynamicComponentMappingTests + { + private class Person + { + public int Id { get; set; } + public IDictionary Info { get; set; } + } + + [Test] + public void WhenMapDynCompoThenMapItAndItsProperties() + { + var mapper = new ModelMapper(); + mapper.Class<Person>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Component(x => x.Info, new { MyInt = 5, MyDate = DateTime.Now }, z => { }); + }); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().SingleOrDefault(); + hbmDynamicComponent.Should().Not.Be.Null(); + hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate"); + } + } +} \ 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-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -259,6 +259,18 @@ destination.RootEntities.Should().Have.Count.EqualTo(1); } + [Test] + public void MergeDynamicComponents() + { + var destination = new ExplicitDeclarationsHolder(); + var source = new ExplicitDeclarationsHolder(); + source.AddAsDynamicComponent(property, typeof(MyClass)); + + destination.Merge(source); + destination.DynamicComponents.Should().Have.Count.EqualTo(1); + destination.GetDynamicComponentTemplate(property).Should().Be(typeof(MyClass)); + } + #region Nested type: MyClass private class MyClass Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 14:14:26 UTC (rev 5736) @@ -536,6 +536,7 @@ <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ModelMapperAddMappingByTypeTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\SubclassMappingRegistration.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\UnionSubclassMappingRegistrationTest.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\DynamicComponentMappingTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\IdBagMappingTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\NaturalIdTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2011-04-22 02:55:55
|
Revision: 5735 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5735&view=rev Author: julian-maughan Date: 2011-04-22 02:55:49 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Created tag for 3.2.0.Alpha2 release Added Paths: ----------- tags/3.2.0.Alpha2/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2011-04-22 02:49:32
|
Revision: 5734 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5734&view=rev Author: julian-maughan Date: 2011-04-22 02:49:26 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Created tag for 3.2.0.Alpha1 release Added Paths: ----------- tags/3.2.0.Alpha1/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2011-04-22 02:43:06
|
Revision: 5733 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5733&view=rev Author: julian-maughan Date: 2011-04-22 02:43:01 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Created tag for 3.1.0.GA release Added Paths: ----------- tags/3.1.0GA/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-04-21 05:13:49
|
Revision: 5732 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5732&view=rev Author: patearl Date: 2011-04-21 05:13:43 +0000 (Thu, 21 Apr 2011) Log Message: ----------- Linq: Handle methods that return true or false when provided with null. Significant code simplification. (NH-2583 again) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-21 03:42:15 UTC (rev 5731) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-21 05:13:43 UTC (rev 5732) @@ -1,3 +1,4 @@ +// FIXME - Are there other things that can convert N into T? What about the ?: operator? using System; using System.Collections.Generic; using System.Linq.Expressions; @@ -28,6 +29,8 @@ private static readonly int[,] AND = new int[8, 8]; private static readonly int[,] OR = new int[8, 8]; private static readonly int[] NOT = new int[8]; + private static readonly int[] ISNULL = new int[8]; + private static readonly int[] ISNOTNULL = new int[8]; /// <summary> /// Setup of <see cref="AND"/>, <see cref="OR"/>, <see cref="NOT"/>. @@ -38,6 +41,12 @@ NOT[T] = F; NOT[N] = N; NOT[F] = T; + ISNULL[T] = F; + ISNULL[N] = T; + ISNULL[F] = F; + ISNOTNULL[T] = T; + ISNOTNULL[N] = F; + ISNOTNULL[F] = T; foreach (var p in new[] { T, N, F }) { @@ -66,15 +75,21 @@ foreach (var p in allValues) { int[] splitP = split[p]; - // We only need to compute NOT for compound values. + // We only need to compute unary operations for compound values. if (splitP.Length > 1) { int notResult = 0; + int isNullResult = 0; + int isNotNullResult = 0; foreach (var p0 in splitP) { notResult |= NOT[p0]; + isNullResult |= ISNULL[p0]; + isNotNullResult |= ISNOTNULL[p0]; } NOT[p] = notResult; + ISNULL[p] = isNullResult; + ISNOTNULL[p] = isNotNullResult; } foreach (var q in allValues) { @@ -106,7 +121,6 @@ private Stack<Dictionary<string, int>> _memberExpressionMappings = new Stack<Dictionary<string, int>>(); // The following two are used for member expressions traversal. - private Stack<HashSet<string>> _collectedPathMemberExpressionsInExpressions = new Stack<HashSet<string>>(); private int _memberExpressionDepth = 0; internal @@ -115,6 +129,24 @@ { } + internal static void Find(Expression expression, NameGenerator nameGenerator, IIsEntityDecider isEntityDecider, Dictionary<string, NhJoinClause> joins, Dictionary<MemberExpression, QuerySourceReferenceExpression> expressionMap) + { + WhereJoinDetector f = new WhereJoinDetector(nameGenerator, isEntityDecider, joins, expressionMap); + + f._memberExpressionMappings.Push(new Dictionary<string, int>()); + + f.VisitExpression(expression); + + foreach (var mapping in f._memberExpressionMappings.Pop()) + { + // If outer join can never produce true, we can safely inner join. + if ((mapping.Value & T) == 0) + { + f.MakeInnerIfJoined(mapping.Key); + } + } + } + protected override Expression VisitBinaryExpression(BinaryExpression expression) { ArgumentUtility.CheckNotNull("expression", expression); @@ -131,7 +163,7 @@ var newRight = VisitExpression(expression.Right); var rightMapping = _memberExpressionMappings.Pop(); - BinaryMapping(_memberExpressionMappings.Peek(), leftMapping, rightMapping, AND); + BinaryMapping(leftMapping, rightMapping, AND); // The following is copy-pasted from Relinq's visitor, as I had to split the code above. var newConversion = (LambdaExpression)VisitExpression(expression.Conversion); @@ -149,7 +181,7 @@ var newRight = VisitExpression(expression.Right); var rightMapping = _memberExpressionMappings.Pop(); - BinaryMapping(_memberExpressionMappings.Peek(), leftMapping, rightMapping, OR); + BinaryMapping(leftMapping, rightMapping, OR); // Again, the following is copy-pasted from Relinq's visitor, as I had to split the code above. var newConversion = (LambdaExpression)VisitExpression(expression.Conversion); @@ -157,39 +189,22 @@ baseResult = Expression.MakeBinary(expression.NodeType, newLeft, newRight, expression.IsLiftedToNull, expression.Method, newConversion); } else if (expression.Type == typeof(bool) - && (expression.NodeType == ExpressionType.Equal && !IsNullConstantExpression(expression.Right) && !IsNullConstantExpression(expression.Left) - || expression.NodeType == ExpressionType.NotEqual && !IsNullConstantExpression(expression.Right) && !IsNullConstantExpression(expression.Left) - || expression.NodeType == ExpressionType.LessThan - || expression.NodeType == ExpressionType.LessThanOrEqual - || expression.NodeType == ExpressionType.GreaterThan - || expression.NodeType == ExpressionType.GreaterThanOrEqual)) + && expression.NodeType == ExpressionType.NotEqual + && (IsNullConstantExpression(expression.Right) || IsNullConstantExpression(expression.Left))) { - // Cases (e), (f).2, (g).2 - _collectedPathMemberExpressionsInExpressions.Push(new HashSet<string>()); - - baseResult = base.VisitBinaryExpression(expression); - - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), N); - } - else if (expression.Type == typeof(bool) - && expression.NodeType == ExpressionType.NotEqual) - { // Case (h) - _collectedPathMemberExpressionsInExpressions.Push(new HashSet<string>()); - + _memberExpressionMappings.Push(new Dictionary<string, int>()); baseResult = base.VisitBinaryExpression(expression); - - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), F); + UnaryMapping(_memberExpressionMappings.Pop(), ISNOTNULL); } else if (expression.Type == typeof(bool) - && expression.NodeType == ExpressionType.Equal) + && expression.NodeType == ExpressionType.Equal + && (IsNullConstantExpression(expression.Right) || IsNullConstantExpression(expression.Left))) { // Case (i) - _collectedPathMemberExpressionsInExpressions.Push(new HashSet<string>()); - + _memberExpressionMappings.Push(new Dictionary<string, int>()); baseResult = base.VisitBinaryExpression(expression); - - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), T); + UnaryMapping(_memberExpressionMappings.Pop(), ISNULL); } else // +, * etc. { @@ -199,51 +214,6 @@ return baseResult; } - private static void FixedMapping(Dictionary<string, int> resultMapping, IEnumerable<string> collectedPathMemberExpressionsInExpression, int value) - { - foreach (var me in collectedPathMemberExpressionsInExpression) - { - // This ORing behavior was added without much thought to fix NHibernate.Test.NHSpecificTest.NH2378.Fixture.ShortEntityCanBeQueryCorrectlyUsingLinqProvider. - if (resultMapping.ContainsKey(me)) - resultMapping[me] |= value; - else - resultMapping.Add(me, value); - } - } - - private static void BinaryMapping(Dictionary<string, int> resultMapping, Dictionary<string, int> leftMapping, Dictionary<string, int> rightMapping, int[,] op) - { - // Compute mapping for all member expressions in leftMapping. If the member expression is missing - // in rightMapping, use TNF as a "pessimistic approximation" instead (inside the ?: operator). See - // the text for an explanation of this. - foreach (var lhs in leftMapping) - { - resultMapping.Add(lhs.Key, op[lhs.Value, rightMapping.ContainsKey(lhs.Key) ? rightMapping[lhs.Key] : TNF]); - } - // Compute mapping for all member expressions *only* in rightMapping (we did the common ones above). - // Again, use TNF as pessimistic approximation to result of left subcondition. - foreach (var rhs in rightMapping) - { - if (!leftMapping.ContainsKey(rhs.Key)) - { - resultMapping[rhs.Key] = op[rhs.Value, TNF]; - } - } - } - - private static bool IsNullConstantExpression(Expression expression) - { - if (expression is ConstantExpression) - { - var constant = (ConstantExpression)expression; - return constant.Value == null; - } - else - { - return false; - } - } - protected override Expression VisitUnaryExpression(UnaryExpression expression) { ArgumentUtility.CheckNotNull("expression", expression); @@ -254,12 +224,7 @@ // Case (c) from text at NH-2583. _memberExpressionMappings.Push(new Dictionary<string, int>()); baseResult = VisitExpression(expression.Operand); - var opMapping = _memberExpressionMappings.Pop(); - - foreach (var m in opMapping) - { - _memberExpressionMappings.Peek().Add(m.Key, NOT[m.Value]); - } + UnaryMapping(_memberExpressionMappings.Pop(), NOT); } else { @@ -284,104 +249,105 @@ protected override Expression VisitMethodCallExpression(MethodCallExpression expression) { - // Similar logic to VisitMemberExpression, but for handling boolean method results instead of boolean members. - bool addOwnMemberExpressionMapping = false; - if (_memberExpressionDepth == 0 && _collectedPathMemberExpressionsInExpressions.Count == 0) - { - if (expression.Type != typeof(bool)) - throw new AssertionFailure("Was expecting a boolean member expression."); - addOwnMemberExpressionMapping = true; - _collectedPathMemberExpressionsInExpressions.Push(new HashSet<string>()); - } + _memberExpressionMappings.Push(new Dictionary<string, int>()); + Expression result = base.VisitMethodCallExpression(expression); + // We would usually get NULL if one of our inner member expresions was null. (Mapped to N) + // However, it's possible a method call will convert the null value from the failed join into any one of True, False, or Null. (Mapped to TNF) + // This could be optimized by actually checking what the method does. For example StartsWith("s") would leave null as null and would still allow us to inner join. + FixedMapping(_memberExpressionMappings.Pop(), TNF); + return result; + } + protected override Expression VisitMemberExpression(MemberExpression expression) + { + ArgumentUtility.CheckNotNull("expression", expression); + + Expression newExpression; try { - return base.VisitMethodCallExpression(expression); + _memberExpressionDepth++; + newExpression = base.VisitExpression(expression.Expression); } finally { - if (addOwnMemberExpressionMapping) - { - // We would often get the same mapping as the not-null (in)equality clause in VisitBinaryExpression. - // However, it's possible a method call will convert the null value from the failed join into any one of True, False, or Null. - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), TNF); - } + _memberExpressionDepth--; } - } + bool isEntity = _isEntityDecider.IsEntity(expression.Type); - protected override Expression VisitMemberExpression(MemberExpression expression) - { - ArgumentUtility.CheckNotNull("expression", expression); + if (isEntity) + { + // See (h) why we do not check for _memberExpressionDepth here! + AddPossibility(ExpressionKeyVisitor.Visit(expression, null), N); + } - // For the boolean part of expressions like: a => a.B.C == 1 && a.D.E - // There wouldn't have been a parent operator to collect paths for a.D.E. - // Below we add the same mapping as if we were doing a.D.E == true. - bool addOwnMemberExpressionMapping = false; - if (_memberExpressionDepth == 0 && _collectedPathMemberExpressionsInExpressions.Count == 0) + if (_memberExpressionDepth > 0 && isEntity) { - if (expression.Type != typeof(bool)) - throw new AssertionFailure("Was expecting a boolean member expression."); - addOwnMemberExpressionMapping = true; - _collectedPathMemberExpressionsInExpressions.Push(new HashSet<string>()); + return AddJoin(expression); } + else + { + if (newExpression != expression.Expression) + return Expression.MakeMemberAccess(newExpression, expression.Member); + return expression; + } + } - try + private void FixedMapping(Dictionary<string, int> sourceMapping, int value) + { + foreach (var me in sourceMapping.Keys) { - Expression newExpression; - try - { - _memberExpressionDepth++; - newExpression = base.VisitExpression(expression.Expression); - } - finally - { - _memberExpressionDepth--; - } - bool isEntity = _isEntityDecider.IsEntity(expression.Type); + AddPossibility(me, value); + } + } - if (isEntity) - { - // See (h) why we do not check for _memberExpressionDepth here! - _collectedPathMemberExpressionsInExpressions.Peek().Add(ExpressionKeyVisitor.Visit(expression, null)); - } - - if (_memberExpressionDepth > 0 && isEntity) - { - return AddJoin(expression); - } - else - { - if (newExpression != expression.Expression) - return Expression.MakeMemberAccess(newExpression, expression.Member); - return expression; - } + private void BinaryMapping(Dictionary<string, int> leftMapping, Dictionary<string, int> rightMapping, int[,] op) + { + // Compute mapping for all member expressions in leftMapping. If the member expression is missing + // in rightMapping, use TNF as a "pessimistic approximation" instead (inside the ?: operator). See + // the text for an explanation of this. + foreach (var lhs in leftMapping) + { + AddPossibility(lhs.Key, op[lhs.Value, rightMapping.ContainsKey(lhs.Key) ? rightMapping[lhs.Key] : TNF]); } - finally + // Compute mapping for all member expressions *only* in rightMapping (we did the common ones above). + // Again, use TNF as pessimistic approximation to result of left subcondition. + foreach (var rhs in rightMapping) { - if (addOwnMemberExpressionMapping) + if (!leftMapping.ContainsKey(rhs.Key)) { - // Same mapping as the not-null (in)equality clause in VisitBinaryExpression. - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), N); + AddPossibility(rhs.Key, op[rhs.Value, TNF]); } } } - internal static void Find(Expression expression, NameGenerator nameGenerator, IIsEntityDecider isEntityDecider, Dictionary<string, NhJoinClause> joins, Dictionary<MemberExpression, QuerySourceReferenceExpression> expressionMap) + private void UnaryMapping(Dictionary<string, int> sourceMapping, int[] op) { - WhereJoinDetector f = new WhereJoinDetector(nameGenerator, isEntityDecider, joins, expressionMap); + foreach (var item in sourceMapping) + { + AddPossibility(item.Key, op[item.Value]); + } + } - f._memberExpressionMappings.Push(new Dictionary<string, int>()); - - f.VisitExpression(expression); - - foreach (var mapping in f._memberExpressionMappings.Pop()) + private static bool IsNullConstantExpression(Expression expression) + { + if (expression is ConstantExpression) { - // If outer join can never produce true, we can safely inner join. - if ((mapping.Value & T) == 0) - { - f.MakeInnerIfJoined(mapping.Key); - } + var constant = (ConstantExpression)expression; + return constant.Value == null; } + else + { + return false; + } } + + private void AddPossibility(string memberPath, int value) + { + Dictionary<string, int> mapping = _memberExpressionMappings.Peek(); + if (mapping.ContainsKey(memberPath)) + mapping[memberPath] |= value; + else + mapping[memberPath] = value; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2011-04-21 03:42:21
|
Revision: 5731 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5731&view=rev Author: patearl Date: 2011-04-21 03:42:15 +0000 (Thu, 21 Apr 2011) Log Message: ----------- Linq: Handle methods that return true or false when provided with null. (NH-2583 again) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-20 21:59:24 UTC (rev 5730) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-21 03:42:15 UTC (rev 5731) @@ -302,8 +302,9 @@ { if (addOwnMemberExpressionMapping) { - // Same mapping as the not-null (in)equality clause in VisitBinaryExpression. - FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), N); + // We would often get the same mapping as the not-null (in)equality clause in VisitBinaryExpression. + // However, it's possible a method call will convert the null value from the failed join into any one of True, False, or Null. + FixedMapping(_memberExpressionMappings.Peek(), _collectedPathMemberExpressionsInExpressions.Pop(), TNF); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-20 21:59:30
|
Revision: 5730 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5730&view=rev Author: fabiomaulo Date: 2011-04-20 21:59:24 +0000 (Wed, 20 Apr 2011) Log Message: ----------- Entities and Component mappers supporting dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:46:13 UTC (rev 5729) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:59:24 UTC (rev 5730) @@ -68,7 +68,9 @@ { throw new ArgumentOutOfRangeException("property", "Can't add a property of another graph"); } - throw new NotImplementedException(); + var hbm = new HbmDynamicComponent { name = property.Name }; + mapping(new DynamicComponentMapper(hbm, property, MapDoc)); + AddProperty(hbm); } public virtual void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:46:13 UTC (rev 5729) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:59:24 UTC (rev 5730) @@ -1,7 +1,9 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; using NHibernate.Mapping.ByCode.Impl; using NUnit.Framework; using SharpTestsEx; @@ -31,6 +33,10 @@ { public IDictionary<string, string> Dictionary { get; set; } } + private class MyClassWithDynamic + { + public IDictionary DynCompo { get; set; } + } [Test] public void CantCreateWithoutHbmMapping() @@ -111,6 +117,25 @@ elementRelationCalled.Should().Be.True(); } + [Test] + public void AddDynamicComponentProperty() + { + var properties = new List<object>(); + var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties); + map.Component(For<MyClassWithDynamic>.Property(x => x.DynCompo), (IDynamicComponentMapper cp) => { }); + properties.Single().Should().Be.OfType<HbmDynamicComponent>().And.ValueOf.Name.Should().Be.EqualTo("DynCompo"); + } + + [Test] + public void CallDynamicComponentMapper() + { + var properties = new List<object>(); + var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties); + var called = false; + map.Component(For<MyClassWithDynamic>.Property(x=> x.DynCompo), (IDynamicComponentMapper cp) => called = true); + called.Should().Be.True(); + } + private class HackPropertyContainerMapper : AbstractPropertyContainerMapper { public HackPropertyContainerMapper(System.Type container, HbmMapping mapDoc) : base(container, mapDoc) {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-20 21:46:19
|
Revision: 5729 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5729&view=rev Author: fabiomaulo Date: 2011-04-20 21:46:13 +0000 (Wed, 20 Apr 2011) Log Message: ----------- DynamicComponentMapper on the road Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-20 21:27:33 UTC (rev 5728) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-20 21:46:13 UTC (rev 5729) @@ -5,20 +5,18 @@ namespace NHibernate.Mapping.ByCode.Impl { - public class DynamicComponentMapper : IDynamicComponentMapper + public class DynamicComponentMapper : AbstractPropertyContainerMapper, IDynamicComponentMapper { private readonly HbmDynamicComponent component; - private readonly HbmMapping mapDoc; private readonly IAccessorPropertyMapper accessorPropertyMapper; - public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) + public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) : base(declaringTypeMember.DeclaringType, mapDoc) { this.component = component; - this.mapDoc = mapDoc; accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x); } - private void AddProperty(object property) + protected override void AddProperty(object property) { if (property == null) { @@ -28,6 +26,11 @@ component.Items = component.Items == null ? toAdd : component.Items.Concat(toAdd).ToArray(); } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) + { + return true; + } + public void Access(Accessor accessor) { accessorPropertyMapper.Access(accessor); @@ -52,62 +55,5 @@ { component.insert = consideredInInsertQuery; } - - public void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) - { - throw new NotImplementedException(); - } - - public void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) - { - throw new NotImplementedException(); - } - - public void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) - { - throw new NotImplementedException(); - } - - public void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping) - { - throw new NotImplementedException(); - } - - public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) - { - throw new NotImplementedException(); - } - - public void Property(MemberInfo property, Action<IPropertyMapper> mapping) - { - var hbmProperty = new HbmProperty { name = property.Name }; - mapping(new PropertyMapper(property, hbmProperty)); - AddProperty(hbmProperty); - } - - public void Component(MemberInfo property, Action<IComponentMapper> mapping) - { - throw new NotImplementedException(); - } - - public void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping) - { - throw new NotImplementedException(); - } - - public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) - { - throw new NotImplementedException(); - } - - public void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) - { - throw new NotImplementedException(); - } - - public void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping) - { - throw new NotImplementedException(); - } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |