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