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: <fab...@us...> - 2011-05-09 16:06:03
|
Revision: 5803
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5803&view=rev
Author: fabiomaulo
Date: 2011-05-09 16:05:57 +0000 (Mon, 09 May 2011)
Log Message:
-----------
Going to release
Modified Paths:
--------------
trunk/nhibernate/releasenotes.txt
Modified: trunk/nhibernate/releasenotes.txt
===================================================================
--- trunk/nhibernate/releasenotes.txt 2011-05-09 16:00:11 UTC (rev 5802)
+++ trunk/nhibernate/releasenotes.txt 2011-05-09 16:05:57 UTC (rev 5803)
@@ -10,6 +10,35 @@
* For users who don't look at Log-ERROR, to prevent wrong behavior when lazy-properties are used the DynamicProxyValidator validates the accessability of properties setters.
* For those implementing IDrive without inherit from DriveBase: IDrive.AdjustCommand
+Build 3.2.0.Aplha3 (rev5803)
+=============================
+** Sub-task
+ * [NH-1344] - QueryTranslator: Invalid Cast to object array when using IResultTransformer
+ * [NH-1642] - one-to-many collection doesn't work if the child is mapped using table per class
+
+** Bug
+ * [NH-1090] - Query cache does not work when using Criteria API to create a projection query with a result transformer
+ * [NH-1747] - Lazy load failure on items using <join> if FK for bag is in the secondary table
+ * [NH-2510] - Lazy-loading doesn't work with cache
+ * [NH-2569] - IDGeneratorBinding seems broken when mixing schemas
+ * [NH-2587] - .Cacheable().Fetch() throws 'Exception occurred getter of xxx'
+ * [NH-2661] - NHibernate cannot handle SQL Server TIME columns when built with the .NET 4 framework
+ * [NH-2673] - Nhibernate 2nd level cache and Result transformer
+ * [NH-2685] - Unnecessary proxy initialisation in CriteriaQueryTranslator
+ * [NH-2686] - Embedded ResultsTransformers should implements Equals/GetHashCode
+
+** Improvement
+ * [NH-2505] - Querries with WHERE containing SQL Server 'bit' datatype produce CASE construction
+ * [NH-2551] - Bad code practice. Function SessionFactoryImpl.GetImplementors: if type not found - value from ReflectHelper.ClassForFullName returns through TypeLoadException.
+ * [NH-2670] - Stateless Session load no-lazy collection
+ * [NH-2684] - More simple way to add NamedQueries by-code
+
+** New Feature
+ * [NH-2674] - QueryOver doesn't have support for entity-name
+
+** Patch
+ * [NH-2669] - Patch to prevent "NHibernate.AssertionFailure: possible non-threadsafe access to the session" error caused by stateless sessions
+
Build 3.2.0.Aplha2 (rev5715)
=============================
** Bug
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-09 16:00:18
|
Revision: 5802
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5802&view=rev
Author: fabiomaulo
Date: 2011-05-09 16:00:11 +0000 (Mon, 09 May 2011)
Log Message:
-----------
Fix NH-2684
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs
trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs
Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs 2011-05-09 14:14:11 UTC (rev 5801)
+++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationExtensions.cs 2011-05-09 16:00:11 UTC (rev 5802)
@@ -1,6 +1,7 @@
using System;
using NHibernate.Cfg.Loquacious;
using NHibernate.Context;
+using NHibernate.Engine;
using NHibernate.Hql;
using NHibernate.Linq.Functions;
using NHibernate.Util;
@@ -136,6 +137,26 @@
return configuration;
}
+ public static Configuration AddNamedQuery(this Configuration configuration, string queryIdentifier, Action<INamedQueryDefinitionBuilder> namedQueryDefinition)
+ {
+ if (configuration == null)
+ {
+ throw new ArgumentNullException("configuration");
+ }
+ if (queryIdentifier == null)
+ {
+ throw new ArgumentNullException("queryIdentifier");
+ }
+ if (namedQueryDefinition == null)
+ {
+ throw new ArgumentNullException("namedQueryDefinition");
+ }
+ var builder = new NamedQueryDefinitionBuilder();
+ namedQueryDefinition(builder);
+ configuration.NamedQueries.Add(queryIdentifier, builder.Build());
+ return configuration;
+ }
+
private static Mappings GetMappings(Configuration configuration)
{
Dialect.Dialect dialect = Dialect.Dialect.GetDialect(configuration.Properties);
Added: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/INamedQueryDefinitionBuilder.cs 2011-05-09 16:00:11 UTC (rev 5802)
@@ -0,0 +1,79 @@
+using System.Collections.Generic;
+using NHibernate.Engine;
+
+namespace NHibernate.Cfg.Loquacious
+{
+ public interface INamedQueryDefinitionBuilder
+ {
+ bool IsCacheable { get; set; }
+ string CacheRegion { get; set; }
+ int FetchSize { get; set; }
+ int Timeout { get; set; }
+ FlushMode FlushMode { get; set; }
+ string Query { get; set; }
+ bool IsReadOnly { get; set; }
+ string Comment { get; set; }
+ CacheMode? CacheMode { get; set; }
+ }
+
+ internal class NamedQueryDefinitionBuilder : INamedQueryDefinitionBuilder
+ {
+ private int fetchSize = -1;
+ private int timeout = -1;
+
+ public NamedQueryDefinitionBuilder()
+ {
+ FlushMode = FlushMode.Unspecified;
+ }
+
+ #region INamedQueryDefinitionBuilder Members
+
+ public bool IsCacheable { get; set; }
+ public string CacheRegion { get; set; }
+
+ public int FetchSize
+ {
+ get { return fetchSize; }
+ set
+ {
+ if (value > 0)
+ {
+ fetchSize = value;
+ }
+ else
+ {
+ fetchSize = -1;
+ }
+ }
+ }
+
+ public int Timeout
+ {
+ get { return timeout; }
+ set
+ {
+ if (value > 0)
+ {
+ timeout = value;
+ }
+ else
+ {
+ timeout = -1;
+ }
+ }
+ }
+
+ public FlushMode FlushMode { get; set; }
+ public string Query { get; set; }
+ public bool IsReadOnly { get; set; }
+ public string Comment { get; set; }
+ public CacheMode? CacheMode { get; set; }
+
+ #endregion
+
+ public NamedQueryDefinition Build()
+ {
+ return new NamedQueryDefinition(Query, IsCacheable, CacheRegion, Timeout, FetchSize, FlushMode, CacheMode ,IsReadOnly, Comment, new Dictionary<string, string>(1));
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-09 14:14:11 UTC (rev 5801)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-09 16:00:11 UTC (rev 5802)
@@ -113,6 +113,7 @@
<Compile Include="Cache\Timestamper.cs" />
<Compile Include="Cache\UpdateTimestampsCache.cs" />
<Compile Include="CallbackException.cs" />
+ <Compile Include="Cfg\Loquacious\INamedQueryDefinitionBuilder.cs" />
<Compile Include="Cfg\MappingsQueue.cs" />
<Compile Include="Cfg\Configuration.cs" />
<Compile Include="Cfg\ConfigurationSectionHandler.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/NamedQueryTests.cs 2011-05-09 16:00:11 UTC (rev 5802)
@@ -0,0 +1,76 @@
+using System.Linq;
+using NHibernate.Cfg;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.CfgTest.Loquacious
+{
+ public class NamedQueryTests
+ {
+ [Test]
+ public void AddSimpleNamedQuery()
+ {
+ var configure = new Configuration();
+ configure.AddNamedQuery("aQuery", b =>
+ {
+ b.Query = "from System.Object o";
+ });
+
+ configure.NamedQueries.Should().Have.Count.EqualTo(1);
+ configure.NamedQueries.Keys.Single().Should().Be("aQuery");
+ configure.NamedQueries.Values.Single().Query.Should().Be("from System.Object o");
+ }
+
+ [Test]
+ public void WhenSetInvalidFetchSizeThenLeaveDefault()
+ {
+ var configure = new Configuration();
+ configure.AddNamedQuery("aQuery", b =>
+ {
+ b.Query = "from System.Object o";
+ b.FetchSize = 0;
+ });
+
+ configure.NamedQueries.Values.Single().FetchSize.Should().Be(-1);
+ }
+
+ [Test]
+ public void WhenSetValidFetchSizeThenSetValue()
+ {
+ var configure = new Configuration();
+ configure.AddNamedQuery("aQuery", b =>
+ {
+ b.Query = "from System.Object o";
+ b.FetchSize = 15;
+ });
+
+ configure.NamedQueries.Values.Single().FetchSize.Should().Be(15);
+ }
+
+ [Test]
+ public void WhenSetInvalidTimeoutThenLeaveDefault()
+ {
+ var configure = new Configuration();
+ configure.AddNamedQuery("aQuery", b =>
+ {
+ b.Query = "from System.Object o";
+ b.Timeout = 0;
+ });
+
+ configure.NamedQueries.Values.Single().Timeout.Should().Be(-1);
+ }
+
+ [Test]
+ public void WhenSetValidTimeoutThenSetValue()
+ {
+ var configure = new Configuration();
+ configure.AddNamedQuery("aQuery", b =>
+ {
+ b.Query = "from System.Object o";
+ b.Timeout = 123;
+ });
+
+ configure.NamedQueries.Values.Single().Timeout.Should().Be(123);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 14:14:11 UTC (rev 5801)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 16:00:11 UTC (rev 5802)
@@ -151,6 +151,7 @@
<Compile Include="CfgTest\Loquacious\EntityCacheConfigurationFixture.cs" />
<Compile Include="CfgTest\Loquacious\EntityToCache.cs" />
<Compile Include="CfgTest\Loquacious\LambdaConfigurationFixture.cs" />
+ <Compile Include="CfgTest\Loquacious\NamedQueryTests.cs" />
<Compile Include="CfgTest\Loquacious\TypeDefinitionFixture.cs" />
<Compile Include="CfgTest\MappingDocumentAggregatorTests.cs" />
<Compile Include="CfgTest\MappingDocumentParserTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-09 14:14:18
|
Revision: 5801
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5801&view=rev
Author: fabiomaulo
Date: 2011-05-09 14:14:11 +0000 (Mon, 09 May 2011)
Log Message:
-----------
Fix NH-2510
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs
Modified: trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-08 22:59:17 UTC (rev 5800)
+++ trunk/nhibernate/src/NHibernate/Type/TypeHelper.cs 2011-05-09 14:14:11 UTC (rev 5801)
@@ -61,10 +61,17 @@
/// <returns></returns>
public static object[] Assemble(object[] row, ICacheAssembler[] types, ISessionImplementor session, object owner)
{
- object[] assembled = new object[row.Length];
+ var assembled = new object[row.Length];
for (int i = 0; i < row.Length; i++)
{
- assembled[i] = types[i].Assemble(row[i], session, owner);
+ if (row[i] == LazyPropertyInitializer.UnfetchedProperty || row[i] == BackrefPropertyAccessor.Unknown)
+ {
+ assembled[i] = row[i];
+ }
+ else
+ {
+ assembled[i] = types[i].Assemble(row[i], session, owner);
+ }
}
return assembled;
}
@@ -110,10 +117,17 @@
public static object[] Replace(object[] original, object[] target, IType[] types, ISessionImplementor session,
object owner, IDictionary copiedAlready)
{
- object[] copied = new object[original.Length];
+ var copied = new object[original.Length];
for (int i = 0; i < original.Length; i++)
{
- copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready);
+ if (original[i] == LazyPropertyInitializer.UnfetchedProperty || original[i] == BackrefPropertyAccessor.Unknown)
+ {
+ copied[i] = target[i];
+ }
+ else
+ {
+ copied[i] = types[i].Replace(original[i], target[i], session, owner, copiedAlready);
+ }
}
return copied;
}
@@ -225,7 +239,7 @@
for (int i = 0; i < span; i++)
{
bool dirty =
- // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state
+ currentState[i] != LazyPropertyInitializer.UnfetchedProperty &&
properties[i].IsDirtyCheckable(anyUninitializedProperties)
&& properties[i].Type.IsDirty(previousState[i], currentState[i], includeColumns[i], session);
@@ -276,7 +290,7 @@
for (int i = 0; i < span; i++)
{
bool dirty =
- // TODO H3: x[ i ] != LazyPropertyInitializer.UnfetchedProperty && //x is the "current" state
+ currentState[i] != LazyPropertyInitializer.UnfetchedProperty &&
properties[i].IsDirtyCheckable(anyUninitializedProperties)
&& properties[i].Type.IsModified(previousState[i], currentState[i], includeColumns[i], session);
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2510/Fixture.cs 2011-05-09 14:14:11 UTC (rev 5801)
@@ -0,0 +1,77 @@
+using System;
+using NHibernate.Cache;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2510
+{
+ public class Image
+ {
+ public virtual int Id { get; set; }
+ public virtual byte[] Data { get; set; }
+ }
+ public class Fixture: TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<Image>(rc =>
+ {
+ rc.Cache(map => map.Usage(CacheUsage.NonstrictReadWrite));
+ rc.Id(x=> x.Id);
+ rc.Property(x => x.Data, map=> map.Lazy(true));
+ });
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ return mappings;
+ }
+
+ protected override void Configure(Cfg.Configuration configuration)
+ {
+ configuration.Cache(x=> x.Provider<HashtableCacheProvider>());
+ }
+
+ private class Scenario: IDisposable
+ {
+ private readonly ISessionFactory factory;
+
+ public Scenario(ISessionFactory factory)
+ {
+ this.factory = factory;
+ using (var session = factory.OpenSession())
+ using (session.BeginTransaction())
+ {
+ session.Persist(new Image { Id = 1 });
+ session.Transaction.Commit();
+ }
+ }
+
+ public void Dispose()
+ {
+ using (var session = factory.OpenSession())
+ using (session.BeginTransaction())
+ {
+ session.CreateQuery("delete from Image").ExecuteUpdate();
+ session.Transaction.Commit();
+ }
+ }
+ }
+
+ [Test]
+ public void WhenReadFromCacheThenDoesNotThrow()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (ISession s = OpenSession())
+ {
+ var book = s.Get<Image>(1);
+ }
+ using (ISession s = OpenSession())
+ {
+ var book = s.Get<Image>(1);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-08 22:59:17 UTC (rev 5800)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 14:14:11 UTC (rev 5801)
@@ -784,6 +784,7 @@
<Compile Include="NHSpecificTest\NH2505\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2507\Animal.cs" />
<Compile Include="NHSpecificTest\NH2507\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2510\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2527\FixtureWithNoBatcher.cs" />
<Compile Include="NHSpecificTest\NH2527\Model.cs" />
<Compile Include="NHSpecificTest\NH2530\Domain.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-08 22:59:25
|
Revision: 5800
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5800&view=rev
Author: fabiomaulo
Date: 2011-05-08 22:59:17 +0000 (Sun, 08 May 2011)
Log Message:
-----------
Fixed class registration ambiguity resolution
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/AbstractExplicitlyDeclaredModel.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -0,0 +1,571 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+
+namespace NHibernate.Mapping.ByCode
+{
+ public abstract class AbstractExplicitlyDeclaredModel : IModelExplicitDeclarationsHolder
+ {
+ private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>();
+ private readonly HashSet<System.Type> components = new HashSet<System.Type>();
+ private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>();
+ 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>();
+ private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>();
+ private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>();
+ private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>();
+ private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>();
+ private readonly Dictionary<System.Type, HashSet<string>> typeSplitGroups = new Dictionary<System.Type, HashSet<string>>();
+ private readonly Dictionary<MemberInfo, string> memberSplitGroup = new Dictionary<MemberInfo, string>();
+ private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>();
+
+ #region Delayed registrations
+ // To allow a free organization of mappings, especially in presence of a IModelMapper not based exclusivelly on pure declarative mapping, and then
+ // provide a descriptive exception when there are some ambiguity, we have to delay the registration as late as we can
+ // (in practice to the moment we have to give a certain asnwer about the strategy used to represent a System.Type hierarchy).
+ private readonly Queue<System.Action> delayedRootEntityRegistrations = new Queue<System.Action>();
+ private readonly Dictionary<System.Type, List<Action<System.Type>>> delayedEntityRegistrations = new Dictionary<System.Type, List<Action<System.Type>>>();
+
+ #endregion
+
+ public IEnumerable<System.Type> RootEntities
+ {
+ get { return rootEntities; }
+ }
+
+ public IEnumerable<System.Type> Components
+ {
+ get { return components; }
+ }
+
+ public IEnumerable<System.Type> TablePerClassEntities
+ {
+ get { return tablePerClassEntities; }
+ }
+
+ public IEnumerable<System.Type> TablePerClassHierarchyEntities
+ {
+ get { return tablePerClassHierarchyEntities; }
+ }
+
+ public IEnumerable<System.Type> TablePerConcreteClassEntities
+ {
+ get { return tablePerConcreteClassEntities; }
+ }
+
+ public IEnumerable<MemberInfo> OneToOneRelations
+ {
+ get { return oneToOneRelations; }
+ }
+
+ public IEnumerable<MemberInfo> ManyToOneRelations
+ {
+ get { return manyToOneRelations; }
+ }
+
+ public IEnumerable<MemberInfo> ManyToManyRelations
+ {
+ get { return manyToManyRelations; }
+ }
+
+ public IEnumerable<MemberInfo> OneToManyRelations
+ {
+ get { return oneToManyRelations; }
+ }
+
+ public IEnumerable<MemberInfo> Any
+ {
+ get { return any; }
+ }
+
+ public IEnumerable<MemberInfo> Poids
+ {
+ get { return poids; }
+ }
+
+ public IEnumerable<MemberInfo> ComposedIds
+ {
+ get { return composedIds; }
+ }
+
+ public IEnumerable<MemberInfo> VersionProperties
+ {
+ get { return versionProperties; }
+ }
+
+ public IEnumerable<MemberInfo> NaturalIds
+ {
+ get { return naturalIds; }
+ }
+
+ public IEnumerable<MemberInfo> Sets
+ {
+ get { return sets; }
+ }
+
+ public IEnumerable<MemberInfo> Bags
+ {
+ get { return bags; }
+ }
+
+ public IEnumerable<MemberInfo> IdBags
+ {
+ get { return idBags; }
+ }
+
+ public IEnumerable<MemberInfo> Lists
+ {
+ get { return lists; }
+ }
+
+ public IEnumerable<MemberInfo> Arrays
+ {
+ get { return arrays; }
+ }
+
+ public IEnumerable<MemberInfo> Dictionaries
+ {
+ get { return dictionaries; }
+ }
+
+ public IEnumerable<MemberInfo> Properties
+ {
+ get { return properties; }
+ }
+
+ public IEnumerable<MemberInfo> DynamicComponents
+ {
+ get { return dynamicComponents; }
+ }
+
+ public IEnumerable<MemberInfo> PersistentMembers
+ {
+ get { return persistentMembers; }
+ }
+
+ public IEnumerable<SplitDefinition> SplitDefinitions
+ {
+ get { return splitDefinitions; }
+ }
+
+ public IEnumerable<string> GetSplitGroupsFor(System.Type type)
+ {
+ HashSet<string> splitsGroupsIds;
+ if (typeSplitGroups.TryGetValue(type, out splitsGroupsIds))
+ {
+ return splitsGroupsIds;
+ }
+ return Enumerable.Empty<string>();
+ }
+
+ public string GetSplitGroupFor(MemberInfo member)
+ {
+ var memberKey = member.GetMemberFromDeclaringType();
+ string splitGroup;
+ if (memberSplitGroup.TryGetValue(memberKey, out splitGroup))
+ {
+ return splitGroup;
+ }
+ return null;
+ }
+
+ public void AddAsRootEntity(System.Type type)
+ {
+ rootEntities.Add(type);
+ if (IsComponent(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
+ }
+ }
+
+ public abstract bool IsComponent(System.Type type);
+
+ public void AddAsComponent(System.Type type)
+ {
+ components.Add(type);
+ var rootEntity = GetSingleRootEntityOrNull(type);
+ if (rootEntity != null)
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
+ }
+ }
+
+ public void AddAsTablePerClassEntity(System.Type type)
+ {
+ AddAsTablePerClassEntity(type, false);
+ }
+
+ protected virtual void AddAsTablePerClassEntity(System.Type type, bool rootEntityMustExists)
+ {
+ if(!rootEntityMustExists)
+ {
+ delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root=> tablePerClassEntities.Add(root)));
+ EnlistTypeRegistration(type, t => AddAsTablePerClassEntity(t, true));
+ return;
+ }
+ if (IsComponent(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
+ }
+ var rootEntity = GetSingleRootEntityOrNull(type);
+ if (rootEntity != null)
+ {
+ if (rootEntity.Equals(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName));
+ }
+ if (IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
+ }
+ }
+ else
+ {
+ throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
+ }
+ }
+
+ public void AddAsTablePerClassHierarchyEntity(System.Type type)
+ {
+ AddAsTablePerClassHierarchyEntity(type, false);
+ }
+
+ protected virtual void AddAsTablePerClassHierarchyEntity(System.Type type, bool rootEntityMustExists)
+ {
+ if (!rootEntityMustExists)
+ {
+ delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root => tablePerClassHierarchyEntities.Add(root)));
+ EnlistTypeRegistration(type, t => AddAsTablePerClassHierarchyEntity(t, true));
+ return;
+ }
+
+ if (IsComponent(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
+ }
+ var rootEntity = GetSingleRootEntityOrNull(type);
+ if (rootEntity != null)
+ {
+ if (rootEntity.Equals(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName));
+ }
+ if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
+ }
+ }
+ else
+ {
+ throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
+ }
+ }
+
+ public void AddAsTablePerConcreteClassEntity(System.Type type)
+ {
+ AddAsTablePerConcreteClassEntity(type, false);
+ }
+
+ protected virtual void AddAsTablePerConcreteClassEntity(System.Type type, bool rootEntityMustExists)
+ {
+ if (!rootEntityMustExists)
+ {
+ delayedRootEntityRegistrations.Enqueue(() => System.Array.ForEach(GetRootEntitentitiesOf(type).ToArray(), root => tablePerConcreteClassEntities.Add(root)));
+ EnlistTypeRegistration(type, t => AddAsTablePerConcreteClassEntity(t, true));
+ return;
+ }
+
+ if (IsComponent(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
+ }
+ var rootEntity = GetSingleRootEntityOrNull(type);
+ if (rootEntity != null)
+ {
+ if (rootEntity.Equals(type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName));
+ }
+ if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type))
+ {
+ throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
+ }
+ }
+ else
+ {
+ throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
+ }
+ }
+
+ public void AddAsOneToOneRelation(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ oneToOneRelations.Add(member);
+ }
+
+ public void AddAsManyToOneRelation(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ manyToOneRelations.Add(member);
+ }
+
+ public void AddAsManyToManyRelation(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ manyToManyRelations.Add(member);
+ }
+
+ public void AddAsOneToManyRelation(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ oneToManyRelations.Add(member);
+ }
+
+ public void AddAsAny(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ any.Add(member);
+ }
+
+ public void AddAsPoid(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ poids.Add(member);
+ }
+
+ public void AddAsPartOfComposedId(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ composedIds.Add(member);
+ }
+
+ public void AddAsVersionProperty(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ versionProperties.Add(member);
+ }
+
+ public void AddAsNaturalId(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ naturalIds.Add(member);
+ }
+
+ public void AddAsSet(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ sets.Add(member);
+ }
+
+ public void AddAsBag(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ bags.Add(member);
+ }
+
+ public void AddAsIdBag(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ idBags.Add(member);
+ }
+
+ public void AddAsList(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ lists.Add(member);
+ }
+
+ public void AddAsArray(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ arrays.Add(member);
+ }
+
+ public void AddAsMap(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ dictionaries.Add(member);
+ }
+
+ public void AddAsProperty(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ properties.Add(member);
+ }
+
+ public void AddAsPersistentMember(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ }
+
+ public void AddAsPropertySplit(SplitDefinition definition)
+ {
+ if (definition == null)
+ {
+ return;
+ }
+ /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem
+ for a legal usage... we will see when the case happen */
+ System.Type propertyContainer = definition.On;
+ string splitGroupId = definition.GroupId;
+ MemberInfo member = definition.Member;
+ var memberKey = member.GetMemberFromDeclaringType();
+ string splitGroup;
+ if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup))
+ {
+ AddTypeSplits(propertyContainer, splitGroupId);
+ memberSplitGroup[memberKey] = splitGroupId;
+ }
+
+ 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;
+ typeSplitGroups.TryGetValue(propertyContainer, out splitsGroupsIds);
+ if(splitsGroupsIds == null)
+ {
+ splitsGroupsIds = new HashSet<string>();
+ typeSplitGroups[propertyContainer] = splitsGroupsIds;
+ }
+ splitsGroupsIds.Add(splitGroupId);
+ }
+
+ public virtual System.Type GetDynamicComponentTemplate(MemberInfo member)
+ {
+ System.Type template;
+ dynamicComponentTemplates.TryGetValue(member, out template);
+ return template ?? typeof(object);
+ }
+
+ protected System.Type GetSingleRootEntityOrNull(System.Type entityType)
+ {
+ var rootTypes = GetRootEntitentitiesOf(entityType).ToList();
+ if(rootTypes.Count > 1)
+ {
+ var sb = new StringBuilder(1024);
+ sb.AppendLine(string.Format("Ambiguous mapping for {0}. More than one root entities was found:", entityType.FullName));
+ foreach (var rootType in rootTypes.AsEnumerable().Reverse())
+ {
+ sb.AppendLine(rootType.FullName);
+ }
+ sb.AppendLine("Possible solutions:");
+ sb.AppendLine("- Merge the mappings of root entity in the one is representing the real root of the hierarchy.");
+ sb.AppendLine("- Inject a IModelInspector with a logic to discover the real root-entity.");
+ throw new MappingException(sb.ToString());
+ }
+ return rootTypes.SingleOrDefault(IsRootEntity);
+ }
+
+ protected IEnumerable<System.Type> GetRootEntitentitiesOf(System.Type entityType)
+ {
+ if (entityType == null)
+ {
+ yield break;
+ }
+ if(IsRootEntity(entityType))
+ {
+ yield return entityType;
+ }
+ foreach (var type in entityType.GetBaseTypes().Where(IsRootEntity))
+ {
+ yield return type;
+ }
+ }
+
+ public abstract bool IsRootEntity(System.Type entityType);
+
+ protected bool IsMappedForTablePerClassEntities(System.Type type)
+ {
+ return IsMappedFor(tablePerClassEntities, type);
+ }
+
+ protected bool IsMappedForTablePerClassHierarchyEntities(System.Type type)
+ {
+ return IsMappedFor(tablePerClassHierarchyEntities, type);
+ }
+
+ protected bool IsMappedForTablePerConcreteClassEntities(System.Type type)
+ {
+ return IsMappedFor(tablePerConcreteClassEntities, type);
+ }
+
+ private bool IsMappedFor(ICollection<System.Type> explicitMappedEntities, System.Type type)
+ {
+ bool isExplicitMapped = explicitMappedEntities.Contains(type);
+ bool isDerived = false;
+
+ if (!isExplicitMapped)
+ {
+ isDerived = type.GetBaseTypes().Any(explicitMappedEntities.Contains);
+ if (isDerived)
+ {
+ explicitMappedEntities.Add(type);
+ }
+ }
+ return isExplicitMapped || isDerived;
+ }
+
+ protected void EnlistTypeRegistration(System.Type type, Action<System.Type> registration)
+ {
+ List<Action<System.Type>> actions;
+ if (!delayedEntityRegistrations.TryGetValue(type, out actions))
+ {
+ actions = new List<Action<System.Type>>();
+ delayedEntityRegistrations[type] = actions;
+ }
+ actions.Add(registration);
+ }
+
+ protected void ExecuteDelayedTypeRegistration(System.Type type)
+ {
+ ExecuteDelayedRootEntitiesRegistrations();
+ List<Action<System.Type>> actions;
+ if (delayedEntityRegistrations.TryGetValue(type, out actions))
+ {
+ foreach (var action in actions)
+ {
+ action(type);
+ }
+ }
+ }
+
+ protected void ExecuteDelayedRootEntitiesRegistrations()
+ {
+ while (delayedRootEntityRegistrations.Count > 0)
+ {
+ delayedRootEntityRegistrations.Dequeue().Invoke();
+ }
+ }
+
+ protected bool HasDelayedEntityRegistration(System.Type type)
+ {
+ return delayedEntityRegistrations.ContainsKey(type);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -1,470 +1,32 @@
-using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace NHibernate.Mapping.ByCode
{
- public class ExplicitlyDeclaredModel : IModelInspector, IModelExplicitDeclarationsHolder
+ public class ExplicitlyDeclaredModel : AbstractExplicitlyDeclaredModel, IModelInspector
{
- private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>();
- private readonly HashSet<System.Type> components = new HashSet<System.Type>();
- private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>();
- private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>();
- 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>();
- private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>();
- private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>();
- private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>();
- private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>();
- private readonly Dictionary<System.Type, Action<System.Type>> delayedEntityRegistrations = new Dictionary<System.Type, Action<System.Type>>();
- private readonly Dictionary<System.Type, HashSet<string>> typeSplitGroups = new Dictionary<System.Type, HashSet<string>>();
- private readonly Dictionary<MemberInfo, string> memberSplitGroup = new Dictionary<MemberInfo, string>();
- private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>();
-
- #region IModelExplicitDeclarationsHolder Members
-
- public IEnumerable<System.Type> RootEntities
- {
- get { return rootEntities; }
- }
-
- public IEnumerable<System.Type> Components
- {
- get { return components; }
- }
-
- public IEnumerable<System.Type> TablePerClassEntities
- {
- get { return tablePerClassEntities; }
- }
-
- public IEnumerable<System.Type> TablePerClassHierarchyEntities
- {
- get { return tablePerClassHierarchyEntities; }
- }
-
- public IEnumerable<System.Type> TablePerConcreteClassEntities
- {
- get { return tablePerConcreteClassEntities; }
- }
-
- public IEnumerable<MemberInfo> OneToOneRelations
- {
- get { return oneToOneRelations; }
- }
-
- public IEnumerable<MemberInfo> ManyToOneRelations
- {
- get { return manyToOneRelations; }
- }
-
- public IEnumerable<MemberInfo> ManyToManyRelations
- {
- get { return manyToManyRelations; }
- }
-
- public IEnumerable<MemberInfo> OneToManyRelations
- {
- get { return oneToManyRelations; }
- }
-
- public IEnumerable<MemberInfo> Any
- {
- get { return any; }
- }
-
- public IEnumerable<MemberInfo> Poids
- {
- get { return poids; }
- }
-
- public IEnumerable<MemberInfo> ComposedIds
- {
- get { return composedIds; }
- }
-
- public IEnumerable<MemberInfo> VersionProperties
- {
- get { return versionProperties; }
- }
-
- public IEnumerable<MemberInfo> NaturalIds
- {
- get { return naturalIds; }
- }
-
- public IEnumerable<MemberInfo> Sets
- {
- get { return sets; }
- }
-
- public IEnumerable<MemberInfo> Bags
- {
- get { return bags; }
- }
-
- public IEnumerable<MemberInfo> IdBags
- {
- get { return idBags; }
- }
-
- public IEnumerable<MemberInfo> Lists
- {
- get { return lists; }
- }
-
- public IEnumerable<MemberInfo> Arrays
- {
- get { return arrays; }
- }
-
- public IEnumerable<MemberInfo> Dictionaries
- {
- get { return dictionaries; }
- }
-
- public IEnumerable<MemberInfo> Properties
- {
- get { return properties; }
- }
-
- public IEnumerable<MemberInfo> DynamicComponents
- {
- get { return dynamicComponents; }
- }
-
- public IEnumerable<MemberInfo> PersistentMembers
- {
- get { return persistentMembers; }
- }
-
- public IEnumerable<SplitDefinition> SplitDefinitions
- {
- get { return splitDefinitions; }
- }
-
- public IEnumerable<string> GetSplitGroupsFor(System.Type type)
- {
- HashSet<string> splitsGroupsIds;
- if (typeSplitGroups.TryGetValue(type, out splitsGroupsIds))
- {
- return splitsGroupsIds;
- }
- return Enumerable.Empty<string>();
- }
-
- public string GetSplitGroupFor(MemberInfo member)
- {
- var memberKey = member.GetMemberFromDeclaringType();
- string splitGroup;
- if (memberSplitGroup.TryGetValue(memberKey, out splitGroup))
- {
- return splitGroup;
- }
- return null;
- }
-
- public void AddAsRootEntity(System.Type type)
- {
- if (IsComponent(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
- }
- rootEntities.Add(type);
- }
-
- public void AddAsComponent(System.Type type)
- {
- var rootEntity = GetRootEntityOrNull(type);
- if (rootEntity != null)
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
- }
- components.Add(type);
- }
-
- public void AddAsTablePerClassEntity(System.Type type)
- {
- AddAsTablePerClassEntity(type, false);
- }
-
- public void AddAsTablePerClassEntity(System.Type type, bool rootEntityMustExists)
- {
- if (IsComponent(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
- }
- var rootEntity = GetRootEntityOrNull(type);
- if (rootEntity != null)
- {
- if (rootEntity.Equals(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class strategy", type.FullName));
- }
- if (IsMappedFor(tablePerClassHierarchyEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
- }
- tablePerClassEntities.Add(rootEntity);
- }
- else
- {
- if(rootEntityMustExists)
- {
- throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
- }
- EnlistTypeRegistration(type, t => AddAsTablePerClassEntity(t, true));
- }
- }
-
- public void AddAsTablePerClassHierarchyEntity(System.Type type)
- {
- AddAsTablePerClassHierarchyEntity(type, false);
- }
-
- public void AddAsTablePerClassHierarchyEntity(System.Type type, bool rootEntityMustExists)
- {
- if (IsComponent(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
- }
- var rootEntity = GetRootEntityOrNull(type);
- if (rootEntity != null)
- {
- if (rootEntity.Equals(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-class-hierarchy strategy", type.FullName));
- }
- if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerConcreteClassEntities, type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
- }
- tablePerClassHierarchyEntities.Add(rootEntity);
- }
- else
- {
- if (rootEntityMustExists)
- {
- throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
- }
- EnlistTypeRegistration(type, t => AddAsTablePerClassHierarchyEntity(t, true));
- }
- }
-
- public void AddAsTablePerConcreteClassEntity(System.Type type)
- {
- AddAsTablePerConcreteClassEntity(type, false);
- }
-
- public void AddAsTablePerConcreteClassEntity(System.Type type, bool rootEntityMustExists)
- {
- if (IsComponent(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as entity and as component", type.FullName));
- }
- var rootEntity = GetRootEntityOrNull(type);
- if (rootEntity != null)
- {
- if (rootEntity.Equals(type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered as root-entity and as subclass for table-per-concrete-class strategy", type.FullName));
- }
- if (IsMappedFor(tablePerClassEntities, type) || IsMappedFor(tablePerClassHierarchyEntities, type))
- {
- throw new MappingException(string.Format("Ambiguous mapping of {0}. It was registered with more than one class-hierarchy strategy", type.FullName));
- }
- tablePerConcreteClassEntities.Add(rootEntity);
- }
- else
- {
- if (rootEntityMustExists)
- {
- throw new MappingException(string.Format("The root entity for {0} was never registered", type.FullName));
- }
- EnlistTypeRegistration(type, t => AddAsTablePerConcreteClassEntity(t, true));
- }
- }
-
- public void AddAsOneToOneRelation(MemberInfo member)
- {
- persistentMembers.Add(member);
- oneToOneRelations.Add(member);
- }
-
- public void AddAsManyToOneRelation(MemberInfo member)
- {
- persistentMembers.Add(member);
- manyToOneRelations.Add(member);
- }
-
- public void AddAsManyToManyRelation(MemberInfo member)
- {
- persistentMembers.Add(member);
- manyToManyRelations.Add(member);
- }
-
- public void AddAsOneToManyRelation(MemberInfo member)
- {
- persistentMembers.Add(member);
- oneToManyRelations.Add(member);
- }
-
- public void AddAsAny(MemberInfo member)
- {
- persistentMembers.Add(member);
- any.Add(member);
- }
-
- public void AddAsPoid(MemberInfo member)
- {
- persistentMembers.Add(member);
- poids.Add(member);
- }
-
- public void AddAsPartOfComposedId(MemberInfo member)
- {
- persistentMembers.Add(member);
- composedIds.Add(member);
- }
-
- public void AddAsVersionProperty(MemberInfo member)
- {
- persistentMembers.Add(member);
- versionProperties.Add(member);
- }
-
- public void AddAsNaturalId(MemberInfo member)
- {
- persistentMembers.Add(member);
- naturalIds.Add(member);
- }
-
- public void AddAsSet(MemberInfo member)
- {
- persistentMembers.Add(member);
- sets.Add(member);
- }
-
- public void AddAsBag(MemberInfo member)
- {
- persistentMembers.Add(member);
- bags.Add(member);
- }
-
- public void AddAsIdBag(MemberInfo member)
- {
- persistentMembers.Add(member);
- idBags.Add(member);
- }
-
- public void AddAsList(MemberInfo member)
- {
- persistentMembers.Add(member);
- lists.Add(member);
- }
-
- public void AddAsArray(MemberInfo member)
- {
- persistentMembers.Add(member);
- arrays.Add(member);
- }
-
- public void AddAsMap(MemberInfo member)
- {
- persistentMembers.Add(member);
- dictionaries.Add(member);
- }
-
- public void AddAsProperty(MemberInfo member)
- {
- persistentMembers.Add(member);
- properties.Add(member);
- }
-
- public void AddAsPersistentMember(MemberInfo member)
- {
- persistentMembers.Add(member);
- }
-
- public void AddAsPropertySplit(SplitDefinition definition)
- {
- if (definition == null)
- {
- return;
- }
- /* Note: if the user "jump/exclude" a class and then map the property in two subclasses the usage of GetMemberFromDeclaringType() may cause a problem
- for a legal usage... we will see when the case happen */
- System.Type propertyContainer = definition.On;
- string splitGroupId = definition.GroupId;
- MemberInfo member = definition.Member;
- var memberKey = member.GetMemberFromDeclaringType();
- string splitGroup;
- if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup))
- {
- AddTypeSplits(propertyContainer, splitGroupId);
- memberSplitGroup[memberKey] = splitGroupId;
- }
-
- 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;
- typeSplitGroups.TryGetValue(propertyContainer, out splitsGroupsIds);
- if(splitsGroupsIds == null)
- {
- splitsGroupsIds = new HashSet<string>();
- typeSplitGroups[propertyContainer] = splitsGroupsIds;
- }
- splitsGroupsIds.Add(splitGroupId);
- }
-
- #endregion
-
#region Implementation of IModelInspector
- public virtual bool IsRootEntity(System.Type type)
+ public override bool IsRootEntity(System.Type type)
{
- return rootEntities.Contains(type);
+ return RootEntities.Contains(type);
}
- public virtual bool IsComponent(System.Type type)
+ public override bool IsComponent(System.Type type)
{
- return components.Contains(type);
+ return Components.Contains(type);
}
public virtual bool IsEntity(System.Type type)
{
- return rootEntities.Contains(type) || type.GetBaseTypes().Any(t => rootEntities.Contains(t)) || HasDelayedEntityRegistration(type);
+ return RootEntities.Contains(type) || type.GetBaseTypes().Any(t => RootEntities.Contains(t)) || HasDelayedEntityRegistration(type);
}
public virtual bool IsTablePerClass(System.Type type)
{
ExecuteDelayedTypeRegistration(type);
- return IsMappedFor(tablePerClassEntities, type);
+ return IsMappedForTablePerClassEntities(type);
}
public virtual bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member)
@@ -475,166 +37,110 @@
public virtual bool IsTablePerClassHierarchy(System.Type type)
{
ExecuteDelayedTypeRegistration(type);
- return IsMappedFor(tablePerClassHierarchyEntities, type);
+ return IsMappedForTablePerClassHierarchyEntities(type);
}
public virtual bool IsTablePerConcreteClass(System.Type type)
{
ExecuteDelayedTypeRegistration(type);
- return IsMappedFor(tablePerConcreteClassEntities, type);
+ return IsMappedForTablePerConcreteClassEntities(type);
}
public virtual bool IsOneToOne(MemberInfo member)
{
- return oneToOneRelations.Contains(member);
+ return OneToOneRelations.Contains(member);
}
public virtual bool IsManyToOne(MemberInfo member)
{
- return manyToOneRelations.Contains(member);
+ return ManyToOneRelations.Contains(member);
}
public virtual bool IsManyToMany(MemberInfo member)
{
- return manyToManyRelations.Contains(member);
+ return ManyToManyRelations.Contains(member);
}
public virtual bool IsOneToMany(MemberInfo member)
{
- return oneToManyRelations.Contains(member);
+ return OneToManyRelations.Contains(member);
}
public virtual bool IsAny(MemberInfo member)
{
- return any.Contains(member);
+ return Any.Contains(member);
}
public virtual bool IsPersistentId(MemberInfo member)
{
- return poids.Contains(member);
+ return Poids.Contains(member);
}
public bool IsMemberOfComposedId(MemberInfo member)
{
- return composedIds.Contains(member);
+ return ComposedIds.Contains(member);
}
public virtual bool IsVersion(MemberInfo member)
{
- return versionProperties.Contains(member);
+ return VersionProperties.Contains(member);
}
public virtual bool IsMemberOfNaturalId(MemberInfo member)
{
- return naturalIds.Contains(member);
+ return NaturalIds.Contains(member);
}
public virtual bool IsPersistentProperty(MemberInfo member)
{
- return persistentMembers.Contains(member);
+ return PersistentMembers.Contains(member);
}
public virtual bool IsSet(MemberInfo role)
{
- return sets.Contains(role);
+ return Sets.Contains(role);
}
public virtual bool IsBag(MemberInfo role)
{
- return bags.Contains(role);
+ return Bags.Contains(role);
}
public virtual bool IsIdBag(MemberInfo role)
{
- return idBags.Contains(role);
+ return IdBags.Contains(role);
}
public virtual bool IsList(MemberInfo role)
{
- return lists.Contains(role);
+ return Lists.Contains(role);
}
public virtual bool IsArray(MemberInfo role)
{
- return arrays.Contains(role);
+ return Arrays.Contains(role);
}
public virtual bool IsDictionary(MemberInfo role)
{
- return dictionaries.Contains(role);
+ return Dictionaries.Contains(role);
}
public virtual bool IsProperty(MemberInfo member)
{
- return properties.Contains(member);
+ return Properties.Contains(member);
}
- public bool IsDynamicComponent(MemberInfo member)
+ public virtual bool IsDynamicComponent(MemberInfo member)
{
- return dynamicComponents.Contains(member);
+ return DynamicComponents.Contains(member);
}
- public System.Type GetDynamicComponentTemplate(MemberInfo member)
+ public virtual IEnumerable<string> GetPropertiesSplits(System.Type type)
{
- System.Type template;
- dynamicComponentTemplates.TryGetValue(member, out template);
- return template ?? typeof(object);
- }
-
- public IEnumerable<string> GetPropertiesSplits(System.Type type)
- {
return GetSplitGroupsFor(type);
}
#endregion
-
- protected System.Type GetRootEntityOrNull(System.Type entityType)
- {
- if (entityType == null)
- {
- return null;
- }
- if (IsRootEntity(entityType))
- {
- return entityType;
- }
- return entityType.GetBaseTypes().SingleOrDefault(IsRootEntity);
- }
-
- protected bool IsMappedFor(ICollection<System.Type> explicitMappedEntities, System.Type type)
- {
- bool isExplicitMapped = explicitMappedEntities.Contains(type);
- bool isDerived = false;
-
- if (!isExplicitMapped)
- {
- isDerived = type.GetBaseTypes().Any(explicitMappedEntities.Contains);
- if (isDerived)
- {
- explicitMappedEntities.Add(type);
- }
- }
- return isExplicitMapped || isDerived;
- }
-
- protected void EnlistTypeRegistration(System.Type type, Action<System.Type> registration)
- {
- delayedEntityRegistrations.Add(type, registration);
- }
-
- protected void ExecuteDelayedTypeRegistration(System.Type type)
- {
- Action<System.Type> registration;
- if(delayedEntityRegistrations.TryGetValue(type, out registration))
- {
- delayedEntityRegistrations.Remove(type);
- registration(type);
- }
- }
-
- protected bool HasDelayedEntityRegistration(System.Type type)
- {
- return delayedEntityRegistrations.ContainsKey(type);
- }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -11,8 +11,151 @@
/// </summary>
public class SimpleModelInspector : IModelInspector, IModelExplicitDeclarationsHolder
{
- private readonly ExplicitlyDeclaredModel declaredModel = new ExplicitlyDeclaredModel();
+ private class MixinDeclaredModel : AbstractExplicitlyDeclaredModel
+ {
+ private readonly IModelInspector inspector;
+ public MixinDeclaredModel(IModelInspector inspector)
+ {
+ this.inspector = inspector;
+ }
+
+ public override bool IsComponent(System.Type type)
+ {
+ return Components.Contains(type);
+ }
+
+ public override bool IsRootEntity(System.Type entityType)
+ {
+ return inspector.IsRootEntity(entityType);
+ }
+
+ public bool IsEntity(System.Type type)
+ {
+ return RootEntities.Contains(type) || type.GetBaseTypes().Any(t => RootEntities.Contains(t)) || HasDelayedEntityRegistration(type);
+ }
+
+ public bool IsTablePerClass(System.Type type)
+ {
+ ExecuteDelayedTypeRegistration(type);
+ return IsMappedForTablePerClassEntities(type);
+ }
+
+ public bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member)
+ {
+ return Equals(splitGroupId, GetSplitGroupFor(member));
+ }
+
+ public bool IsTablePerClassHierarchy(System.Type type)
+ {
+ ExecuteDelayedTypeRegistration(type);
+ return IsMappedForTablePerClassHierarchyEntities(type);
+ }
+
+ public bool IsTablePerConcreteClass(System.Type type)
+ {
+ ExecuteDelayedTypeRegistration(type);
+ return IsMappedForTablePerConcreteClassEntities(type);
+ }
+
+ public bool IsOneToOne(MemberInfo member)
+ {
+ return OneToOneRelations.Contains(member);
+ }
+
+ public bool IsManyToOne(MemberInfo member)
+ {
+ return ManyToOneRelations.Contains(member);
+ }
+
+ public bool IsManyToMany(MemberInfo member)
+ {
+ return ManyToManyRelations.Contains(member);
+ }
+
+ public bool IsOneToMany(MemberInfo member)
+ {
+ return OneToManyRelations.Contains(member);
+ }
+
+ public bool IsAny(MemberInfo member)
+ {
+ return Any.Contains(member);
+ }
+
+ public bool IsPersistentId(MemberInfo member)
+ {
+ return Poids.Contains(member);
+ }
+
+ public bool IsMemberOfComposedId(MemberInfo member)
+ {
+ return ComposedIds.Contains(member);
+ }
+
+ public bool IsVersion(MemberInfo member)
+ {
+ return VersionProperties.Contains(member);
+ }
+
+ public bool IsMemberOfNaturalId(MemberInfo member)
+ {
+ return NaturalIds.Contains(member);
+ }
+
+ public bool IsPersistentProperty(MemberInfo member)
+ {
+ return PersistentMembers.Contains(member);
+ }
+
+ public bool IsSet(MemberInfo role)
+ {
+ return Sets.Contains(role);
+ }
+
+ public bool IsBag(MemberInfo role)
+ {
+ return Bags.Contains(role);
+ }
+
+ public bool IsIdBag(MemberInfo role)
+ {
+ return IdBags.Contains(role);
+ }
+
+ public bool IsList(MemberInfo role)
+ {
+ return Lists.Contains(role);
+ }
+
+ public bool IsArray(MemberInfo role)
+ {
+ return Arrays.Contains(role);
+ }
+
+ public bool IsDictionary(MemberInfo role)
+ {
+ return Dictionaries.Contains(role);
+ }
+
+ public bool IsProperty(MemberInfo member)
+ {
+ return Properties.Contains(member);
+ }
+
+ public bool IsDynamicComponent(MemberInfo member)
+ {
+ return DynamicComponents.Contains(member);
+ }
+
+ public IEnumerable<string> GetPropertiesSplits(System.Type type)
+ {
+ return GetSplitGroupsFor(type);
+ }
+ }
+
+ private readonly MixinDeclaredModel declaredModel;
+
private Func<System.Type, bool, bool> isEntity = (t, declared) => declared;
private Func<System.Type, bool, bool> isRootEntity;
private Func<System.Type, bool, bool> isTablePerClass;
@@ -56,11 +199,12 @@
isDictionary = (m, declared) => declared || MatchCollection(m, MatchDictionaryMember);
isManyToOne = (m, declared) => declared || MatchManyToOne(m);
isOneToMany = (m, declared) => declared || MatchOneToMany(m);
+ declaredModel = new MixinDeclaredModel(this);
}
private bool MatchRootEntity(System.Type type)
{
- return type.IsClass && typeof(object).Equals(type.BaseType);
+ return type.IsClass && typeof(object).Equals(type.BaseType) && ((IModelInspector)this).IsEntity(type);
}
private bool MatchTablePerClass(System.Type type)
@@ -213,6 +357,10 @@
const BindingFlags flattenHierarchyMembers =
BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
+ if (declaredModel.IsEntity(subject))
+ {
+ return false;
+ }
var modelInspector = (IModelInspector) this;
return !subject.IsEnum && (subject.Namespace == null || !subject.Namespace.StartsWith("System")) /* hack */
&& !modelInspector.IsEntity(subject)
@@ -224,7 +372,10 @@
{
const BindingFlags flattenHierarchyMembers =
BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
-
+ if(declaredModel.Components.Contains(subject))
+ {
+ return false;
+ }
var modelInspector = (IModelInspector) this;
return subject.IsClass &&
subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat(subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m));
@@ -488,13 +639,13 @@
bool IModelInspector.IsRootEntity(System.Type type)
{
- bool declaredResult = declaredModel.IsRootEntity(type);
+ bool declaredResult = declaredModel.RootEntities.Contains(type);
return isRootEntity(type, declaredResult);
}
bool IModelInspector.IsComponent(System.Type type)
{
- bool declaredResult = declaredModel.IsComponent(type);
+ bool declaredResult = declaredModel.Components.Contains(type);
return isComponent(type, declaredResult);
}
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-08 22:59:17 UTC (rev 5800)
@@ -284,6 +284,7 @@
<Compile Include="Mapping\Any.cs" />
<Compile Include="Mapping\Array.cs" />
<Compile Include="Mapping\Bag.cs" />
+ <Compile Include="Mapping\ByCode\AbstractExplicitlyDeclaredModel.cs" />
<Compile Include="Mapping\ByCode\CacheInclude.cs" />
<Compile Include="Mapping\ByCode\CacheUsage.cs" />
<Compile Include="Mapping\ByCode\Cascade.cs" />
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/ComponentMappingRegistrationTests.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -42,27 +42,39 @@
public void WhenRegisteredAsComponetThenCantRegisterAsJoinedSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsComponent(typeof(MyComponent));
+ inspector.AddAsComponent(typeof (MyComponent));
- inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyComponent))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassEntity(typeof (MyComponent));
+ inspector.IsTablePerClass(typeof (MyComponent));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsComponetThenCantRegisterAsSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsComponent(typeof(MyComponent));
+ inspector.AddAsComponent(typeof (MyComponent));
- inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(MyComponent))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassHierarchyEntity(typeof (MyComponent));
+ inspector.IsTablePerClassHierarchy(typeof (MyComponent));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsComponetThenCantRegisterAsUnionSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsComponent(typeof(MyComponent));
+ inspector.AddAsComponent(typeof (MyComponent));
- inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(MyComponent))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerConcreteClassEntity(typeof (MyComponent));
+ inspector.IsTablePerConcreteClass(typeof (MyComponent));
+ }).Should().Throw<MappingException>();
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/JoinedSubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -47,20 +47,28 @@
public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.AddAsTablePerClassEntity(typeof(Inherited1));
+ inspector.AddAsRootEntity(typeof (MyClass));
+ inspector.AddAsTablePerClassEntity(typeof (Inherited1));
- inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1));
+ inspector.IsTablePerClass(typeof (Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsJoinedSubclassThenCantRegisterAsUnionSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.AddAsTablePerClassEntity(typeof(Inherited1));
+ inspector.AddAsRootEntity(typeof (MyClass));
+ inspector.AddAsTablePerClassEntity(typeof (Inherited1));
- inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1));
+ inspector.IsTablePerClass(typeof (Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/RootClassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -103,24 +103,36 @@
public void WhenRegisteredAsRootThenCantRegisterAsSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.Executing(x=> x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>();
+ inspector.AddAsRootEntity(typeof (MyClass));
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassHierarchyEntity(typeof (MyClass));
+ inspector.IsTablePerClassHierarchy(typeof (MyClass));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsRootThenCantRegisterAsJoinedSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>();
+ inspector.AddAsRootEntity(typeof (MyClass));
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassEntity(typeof (MyClass));
+ inspector.IsTablePerClass(typeof (MyClass));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsRootThenCantRegisterAsUnionSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(MyClass))).Throws<MappingException>();
+ inspector.AddAsRootEntity(typeof (MyClass));
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerConcreteClassEntity(typeof (MyClass));
+ inspector.IsTablePerClass(typeof (MyClass));
+ }).Should().Throw<MappingException>();
}
[Test]
@@ -131,5 +143,18 @@
inspector.IsEntity(typeof(MyClass)).Should().Be.True();
}
+
+ [Test]
+ public void WhenMultipleRootRegisteredThenThrowsMappingException()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ inspector.AddAsRootEntity(typeof(MyClass));
+ inspector.AddAsRootEntity(typeof(Inherited1));
+ Executing.This(()=>
+ {
+ inspector.AddAsTablePerClassEntity(typeof(Inherited2));
+ inspector.IsTablePerClass(typeof(Inherited2));
+ }).Should().Throw<MappingException>();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -50,17 +50,25 @@
inspector.AddAsRootEntity(typeof(MyClass));
inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1));
- inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassEntity(typeof(Inherited1));
+ inspector.IsTablePerClass(typeof(Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsSubclassThenCantRegisterAsUnionSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.AddAsTablePerClassHierarchyEntity(typeof(Inherited1));
+ inspector.AddAsRootEntity(typeof (MyClass));
+ inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1));
- inspector.Executing(x => x.AddAsTablePerConcreteClassEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1));
+ inspector.IsTablePerClassHierarchy(typeof (Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/UnionSubclassMappingStrategyTests.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -47,20 +47,28 @@
public void WhenRegisteredAsUnionSubclassThenCantRegisterAsSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1));
+ inspector.AddAsRootEntity(typeof (MyClass));
+ inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1));
- inspector.Executing(x => x.AddAsTablePerClassHierarchyEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassHierarchyEntity(typeof (Inherited1));
+ inspector.IsTablePerConcreteClass(typeof (Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
public void WhenRegisteredAsUnionSubclassThenCantRegisterAsJoinedSubclass()
{
var inspector = new ExplicitlyDeclaredModel();
- inspector.AddAsRootEntity(typeof(MyClass));
- inspector.AddAsTablePerConcreteClassEntity(typeof(Inherited1));
+ inspector.AddAsRootEntity(typeof (MyClass));
+ inspector.AddAsTablePerConcreteClassEntity(typeof (Inherited1));
- inspector.Executing(x => x.AddAsTablePerClassEntity(typeof(Inherited1))).Throws<MappingException>();
+ Executing.This(() =>
+ {
+ inspector.AddAsTablePerClassEntity(typeof (Inherited1));
+ inspector.IsTablePerConcreteClass(typeof (Inherited1));
+ }).Should().Throw<MappingException>();
}
[Test]
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/CallCustomConditions.cs 2011-05-08 22:59:17 UTC (rev 5800)
@@ -0,0 +1,68 @@
+using System;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MixAutomapping
+{
+ public class CallCustomConditions
+ {
+ public enum ActivityType
+ {
+ Form = 1,
+ Custom = 2,
+ Email = 3
+ }
+
+ private class Activity : Entity
+ {
+ public virtual string Title { get; set; }
+ }
+
+ private interface IEntity<T>
+ {
+ T Id { get; }
+ }
+
+ private class Entity : IEntity<Guid>
+ {
+ #region IEntity<Guid> Members
+
+ public virtual Guid Id { get; private set; }
+
+ #endregion
+ }
+
+ private class FormActivity : Activity { }
+
+ [Test]
+ public void WhenCustomizeConditionsThenUseCustomConditionsToRecognizeRootEntities()
+ {
+ System.Type baseEntityType = typeof(Entity);
+ var inspector = new SimpleModelInspector();
+ inspector.IsEntity((t, declared) => baseEntityType.IsAssignableFrom(t) && baseEntityType != t && !t.IsInterface);
+ inspector.IsRootEntity((t, declared) => baseEntityType.Equals(t.BaseType));
+
+ var mapper = new ModelMapper(inspector);
+ mapper.Class<Entity>(map => map.Id(x => x.Id,
+ m =>
+ {
+ m.Generator(Generators.Guid);
+ m.Column("ID");
+ }));
+
+ mapper.Class<Activity>(map =>
+ {
+ map.Discriminator(dm =>
+ {
+ dm.Column("DISCRIMINATOR_TYPE");
+ dm.NotNullable(true);
+ });
+ map.DiscriminatorValue(0);
+ });
+ mapper.Subclass<FormActivity>(map => map.DiscriminatorValue(1));
+
+ mapper.Executing(m=> m.CompileMappingFor(new[] { typeof(Activity), typeof(FormActivity) })).NotThrows();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-06 14:14:41 UTC (rev 5799)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-08 22:59:17 UTC (rev 5800)
@@ -585,6 +585,7 @@
<Compile Include="MappingByCode\MappersTests\UnionSubclassMapperTests\TablesSincronizationTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\ArrayCollectionTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\BagCollectionTests.cs" />
+ <Compile Include="MappingByCode\MixAutomapping\CallCustomConditions.cs" />
<Compile Include="MappingByCode\MixAutomapping\Compone...
[truncated message content] |
|
From: <fab...@us...> - 2011-05-06 14:14:47
|
Revision: 5799
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5799&view=rev
Author: fabiomaulo
Date: 2011-05-06 14:14:41 +0000 (Fri, 06 May 2011)
Log Message:
-----------
cleaned public API
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchKind.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs 2011-05-06 12:28:17 UTC (rev 5798)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheInclude.cs 2011-05-06 14:14:41 UTC (rev 5799)
@@ -7,13 +7,13 @@
public static CacheInclude All = new AllCacheInclude();
public static CacheInclude NonLazy = new NonLazyCacheInclude();
- public abstract HbmCacheInclude ToHbm();
+ internal abstract HbmCacheInclude ToHbm();
#region Nested type: AllCacheInclude
public class AllCacheInclude : CacheInclude
{
- public override HbmCacheInclude ToHbm()
+ internal override HbmCacheInclude ToHbm()
{
return HbmCacheInclude.All;
}
@@ -25,7 +25,7 @@
public class NonLazyCacheInclude : CacheInclude
{
- public override HbmCacheInclude ToHbm()
+ internal override HbmCacheInclude ToHbm()
{
return HbmCacheInclude.NonLazy;
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs 2011-05-06 12:28:17 UTC (rev 5798)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CacheUsage.cs 2011-05-06 14:14:41 UTC (rev 5799)
@@ -9,13 +9,13 @@
public static CacheUsage NonstrictReadWrite = new NonstrictReadWriteUsage();
public static CacheUsage Transactional = new TransactionalUsage();
- public abstract HbmCacheUsage ToHbm();
+ internal abstract HbmCacheUsage ToHbm();
#region Nested type: NonstrictReadWriteUsage
private class NonstrictReadWriteUsage : CacheUsage
{
- public override HbmCacheUsage ToHbm()
+ internal override HbmCacheUsage ToHbm()
{
return HbmCacheUsage.NonstrictReadWrite;
}
@@ -27,7 +27,7 @@
private class ReadOnlyUsage : CacheUsage
{
- public override HbmCacheUsage ToHbm()
+ internal override HbmCacheUsage ToHbm()
{
return HbmCacheUsage.ReadOnly;
}
@@ -39,7 +39,7 @@
private class ReadWriteUsage : CacheUsage
{
- public override HbmCacheUsage ToHbm()
+ internal override HbmCacheUsage ToHbm()
{
return HbmCacheUsage.ReadWrite;
}
@@ -51,7 +51,7 @@
private class TransactionalUsage : CacheUsage
{
- public override HbmCacheUsage ToHbm()
+ internal override HbmCacheUsage ToHbm()
{
return HbmCacheUsage.Transactional;
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs 2011-05-06 12:28:17 UTC (rev 5798)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/CollectionFetchMode.cs 2011-05-06 14:14:41 UTC (rev 5799)
@@ -8,13 +8,13 @@
public static CollectionFetchMode Join = new JoinFetchMode();
public static CollectionFetchMode Subselect = new SubselectFetchMode();
- public abstract HbmCollectionFetchMode ToHbm();
+ internal abstract HbmCollectionFetchMode ToHbm();
#region Nested type: JoinFetchMode
private class JoinFetchMode : CollectionFetchMode
{
- public override HbmCollectionFetchMode ToHbm()
+ internal override HbmCollectionFetchMode ToHbm()
{
return HbmCollectionFetchMode.Join;
}
@@ -26,7 +26,7 @@
private class SelectFetchMode : CollectionFetchMode
{
- public override HbmCollectionFetchMode ToHbm()
+ internal override HbmCollectionFetchMode ToHbm()
{
return HbmCollectionFetchMode.Select;
}
@@ -38,7 +38,7 @@
private class SubselectFetchMode : CollectionFetchMode
{
- public override HbmCollectionFetchMode ToHbm()
+ internal override HbmCollectionFetchMode ToHbm()
{
return HbmCollectionFetchMode.Subselect;
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchKind.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchKind.cs 2011-05-06 12:28:17 UTC (rev 5798)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FetchKind.cs 2011-05-06 14:14:41 UTC (rev 5799)
@@ -7,19 +7,19 @@
public static FetchKind Select = new SelectFetchMode();
public static FetchKind Join = new JoinFetchMode();
- public abstract HbmFetchMode ToHbm();
- public abstract HbmJoinFetch ToHbmJoinFetch();
+ internal abstract HbmFetchMode ToHbm();
+ internal abstract HbmJoinFetch ToHbmJoinFetch();
#region Nested type: JoinFetchMode
private class JoinFetchMode : FetchKind
{
- public override HbmFetchMode ToHbm()
+ internal override HbmFetchMode ToHbm()
{
return HbmFetchMode.Join;
}
- public override HbmJoinFetch ToHbmJoinFetch()
+ internal override HbmJoinFetch ToHbmJoinFetch()
{
return HbmJoinFetch.Join;
}
@@ -31,12 +31,12 @@
private class SelectFetchMode : FetchKind
{
- public override HbmFetchMode ToHbm()
+ internal override HbmFetchMode ToHbm()
{
return HbmFetchMode.Select;
}
- public override HbmJoinFetch ToHbmJoinFetch()
+ internal override HbmJoinFetch ToHbmJoinFetch()
{
return HbmJoinFetch.Select;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-06 12:28:23
|
Revision: 5798
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5798&view=rev
Author: fabiomaulo
Date: 2011-05-06 12:28:17 +0000 (Fri, 06 May 2011)
Log Message:
-----------
Support of Generated for properties
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798)
@@ -19,5 +19,6 @@
void Update(bool consideredInUpdateQuery);
void Insert(bool consideredInInsertQuery);
void Lazy(bool isLazy);
+ void Generated(PropertyGeneration generation);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/KeyPropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798)
@@ -215,6 +215,11 @@
// lazy is not supported by HbmKeyProperty
}
+ public void Generated(PropertyGeneration generation)
+ {
+ // generated is not supported by HbmKeyProperty
+ }
+
private bool ColumnTagIsRequired(HbmColumn hbm)
{
return hbm.precision != null || hbm.scale != null || hbm.notnull || hbm.unique
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-05-03 21:33:56 UTC (rev 5797)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-05-06 12:28:17 UTC (rev 5798)
@@ -259,6 +259,15 @@
propertyMapping.lazy = isLazy;
}
+ public void Generated(PropertyGeneration generation)
+ {
+ if (generation == null)
+ {
+ return;
+ }
+ propertyMapping.generated = generation.ToHbm();
+ }
+
private void ResetColumnPlainValues()
{
propertyMapping.column = null;
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/PropertyGeneration.cs 2011-05-06 12:28:17 UTC (rev 5798)
@@ -0,0 +1,37 @@
+using NHibernate.Cfg.MappingSchema;
+
+namespace NHibernate.Mapping.ByCode
+{
+ public abstract class PropertyGeneration
+ {
+ public static PropertyGeneration Never = new NeverPropertyGeneration();
+ public static PropertyGeneration Insert = new InsertPropertyGeneration();
+ public static PropertyGeneration Always = new AlwaysPropertyGeneration();
+
+ internal abstract HbmPropertyGeneration ToHbm();
+
+ public class AlwaysPropertyGeneration : PropertyGeneration
+ {
+ internal override HbmPropertyGeneration ToHbm()
+ {
+ return HbmPropertyGeneration.Always;
+ }
+ }
+
+ public class InsertPropertyGeneration : PropertyGeneration
+ {
+ internal override HbmPropertyGeneration ToHbm()
+ {
+ return HbmPropertyGeneration.Insert;
+ }
+ }
+
+ public class NeverPropertyGeneration : PropertyGeneration
+ {
+ internal override HbmPropertyGeneration ToHbm()
+ {
+ return HbmPropertyGeneration.Never;
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-03 21:33:56 UTC (rev 5797)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-05-06 12:28:17 UTC (rev 5798)
@@ -304,6 +304,7 @@
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComposedIdCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" />
+ <Compile Include="Mapping\ByCode\PropertyGeneration.cs" />
<Compile Include="Mapping\ByCode\PropertyToField.cs" />
<Compile Include="Mapping\ByCode\SimpleModelInspector.cs" />
<Compile Include="Mapping\ByCode\ExplicitlyDeclaredModel.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-03 21:34:02
|
Revision: 5797
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5797&view=rev
Author: fabiomaulo
Date: 2011-05-03 21:33:56 +0000 (Tue, 03 May 2011)
Log Message:
-----------
Tests for unsupported feature for Skip and Take using parameters instead values
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs
Modified: trunk/nhibernate/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs 2011-05-03 11:20:54 UTC (rev 5796)
+++ trunk/nhibernate/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs 2011-05-03 21:33:56 UTC (rev 5797)
@@ -68,6 +68,20 @@
s.Close();
}
+ [Test, Ignore("Not supported yet.")]
+ public void SkipWithParameter()
+ {
+ ISession s = OpenSession();
+ ITransaction txn = s.BeginTransaction();
+
+ var actual = s.CreateQuery("from Human h order by h.bodyWeight skip :jump").SetInt32("jump", 2).List<Human>().Select(h => h.BodyWeight).ToArray();
+ var expected = new[] { 10, 15, 20 };
+ CollectionAssert.AreEqual(expected, actual);
+
+ txn.Commit();
+ s.Close();
+ }
+
[Test]
public void Take()
{
@@ -82,6 +96,20 @@
s.Close();
}
+ [Test, Ignore("Not supported yet.")]
+ public void TakeWithParameter()
+ {
+ ISession s = OpenSession();
+ ITransaction txn = s.BeginTransaction();
+
+ var actual = s.CreateQuery("from Human h order by h.bodyWeight take :jump").SetInt32("jump", 2).List<Human>().Select(h => h.BodyWeight).ToArray();
+ var expected = new[] { 5, 6 };
+ CollectionAssert.AreEqual(expected, actual);
+
+ txn.Commit();
+ s.Close();
+ }
+
[Test]
public void SkipTake()
{
@@ -96,6 +124,22 @@
s.Close();
}
+ [Test, Ignore("Not supported yet.")]
+ public void SkipTakeWithParameter()
+ {
+ ISession s = OpenSession();
+ ITransaction txn = s.BeginTransaction();
+
+ var actual = s.CreateQuery("from Human h order by h.bodyWeight skip :pSkip take :pTake")
+ .SetInt32("pSkip", 1)
+ .SetInt32("pTake", 3).List<Human>().Select(h => h.BodyWeight).ToArray();
+ var expected = new[] { 6, 10, 15 };
+ CollectionAssert.AreEqual(expected, actual);
+
+ txn.Commit();
+ s.Close();
+ }
+
[Test]
public void TakeSkip()
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-03 11:21:00
|
Revision: 5796
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5796&view=rev
Author: fabiomaulo
Date: 2011-05-03 11:20:54 +0000 (Tue, 03 May 2011)
Log Message:
-----------
Demonstration NH-2587 was fixed
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2587/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2587/CachingWithLinq.cs
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2587/CachingWithLinq.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2587/CachingWithLinq.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2587/CachingWithLinq.cs 2011-05-03 11:20:54 UTC (rev 5796)
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NHibernate.Cache;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Linq;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2587
+{
+ public class Foo
+ {
+ public Foo()
+ {
+ Bars = new List<Bar>();
+ }
+ public virtual Guid Id { get; set; }
+ public virtual ICollection<Bar> Bars { get; set; }
+ }
+
+ public class Bar
+ {
+ public virtual Guid Id { get; set; }
+ public virtual Foo Foo { get; set; }
+ }
+
+ public class CachingWithLinq : TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.BeforeMapClass += (inspector, type, map) => map.Id(x=> x.Generator(Generators.GuidComb));
+ mapper.Class<Foo>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Bag(x => x.Bars, map =>
+ {
+ map.Inverse(true);
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ map.Key(km =>
+ {
+ km.Column("FooId");
+ km.OnDelete(OnDeleteAction.Cascade);
+ });
+ }, rel => rel.OneToMany());
+ });
+ mapper.Class<Bar>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.ManyToOne(x=> x.Foo, map=> map.Column("FooId"));
+ });
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ return mappings;
+ }
+
+ protected override void Configure(Cfg.Configuration configuration)
+ {
+ configuration.Cache(x =>
+ {
+ x.Provider<HashtableCacheProvider>();
+ x.UseQueryCache = true;
+ });
+ }
+
+ public class Scenario: IDisposable
+ {
+ private readonly ISessionFactory factory;
+
+ public Scenario(ISessionFactory factory)
+ {
+ this.factory = factory;
+ using (ISession session = factory.OpenSession())
+ using (ITransaction tx = session.BeginTransaction())
+ {
+ var foo1 = new Foo();
+ foo1.Bars.Add(new Bar {Foo = foo1});
+ foo1.Bars.Add(new Bar { Foo = foo1 });
+ var foo2 = new Foo();
+ foo2.Bars.Add(new Bar { Foo = foo2 });
+
+ session.Persist(foo1);
+ session.Persist(foo2);
+ tx.Commit();
+ }
+ }
+
+ public void Dispose()
+ {
+ using (ISession session = factory.OpenSession())
+ using (ITransaction tx = session.BeginTransaction())
+ {
+ session.CreateQuery("delete from Foo").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+ }
+ [Test]
+ public void TestMethod1()
+ {
+ using (new Scenario(Sfi))
+ {
+ // The test provided is only about Not-Throw
+ using (ISession session = OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+
+ session.Query<Foo>().Cacheable().ToList();
+ session.Query<Bar>().Cacheable().ToList();
+ session.Query<Foo>().Cacheable().Fetch(x => x.Bars).ToList();
+ session.Query<Bar>().Cacheable().Fetch(x => x.Foo).ToList();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 15:41:52 UTC (rev 5795)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-03 11:20:54 UTC (rev 5796)
@@ -804,6 +804,7 @@
<Compile Include="NHSpecificTest\NH2583\MassTestingThreeOrTreesSideBySideFixture.cs" />
<Compile Include="NHSpecificTest\NH2583\MassTestingTwoOrTreesSideBySideFixture.cs" />
<Compile Include="NHSpecificTest\NH2583\SelfJoinTestFixture.cs" />
+ <Compile Include="NHSpecificTest\NH2587\CachingWithLinq.cs" />
<Compile Include="NHSpecificTest\NH2603\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2603\Model.cs" />
<Compile Include="NHSpecificTest\NH2632\Domain.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-02 15:41:59
|
Revision: 5795
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5795&view=rev
Author: fabiomaulo
Date: 2011-05-02 15:41:52 +0000 (Mon, 02 May 2011)
Log Message:
-----------
Fixed NH-2686
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -57,5 +57,33 @@
var list = new ArrayList {transformResult};
return list;
}
+
+ public bool Equals(ResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other._listTransformation, _listTransformation) && Equals(other._itemTransformation, _itemTransformation);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as ResultTransformer);
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ var lt = (_listTransformation != null ? _listTransformation.GetHashCode() : 0);
+ var it = (_itemTransformation != null ? _itemTransformation.GetHashCode() : 0);
+ return (lt * 397) ^ (it * 17);
+ }
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -7,10 +7,14 @@
[Serializable]
public class AliasToBeanConstructorResultTransformer : IResultTransformer
{
- private ConstructorInfo constructor;
+ private readonly ConstructorInfo constructor;
public AliasToBeanConstructorResultTransformer(ConstructorInfo constructor)
{
+ if (constructor == null)
+ {
+ throw new ArgumentNullException("constructor");
+ }
this.constructor = constructor;
}
@@ -33,5 +37,28 @@
{
return collection;
}
+
+ public bool Equals(AliasToBeanConstructorResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other.constructor, constructor);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as AliasToBeanConstructorResultTransformer);
+ }
+
+ public override int GetHashCode()
+ {
+ return constructor.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -111,5 +111,28 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as AliasToBeanResultTransformer);
+ }
+
+ public bool Equals(AliasToBeanResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other.resultClass, resultClass);
+ }
+
+ public override int GetHashCode()
+ {
+ return resultClass.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class AliasToEntityMapResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
IDictionary result = new Hashtable();
@@ -26,5 +28,19 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -10,6 +10,7 @@
public class DistinctRootEntityResultTransformer : IResultTransformer
{
private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DistinctRootEntityResultTransformer));
+ private static readonly object Hasher = new object();
internal sealed class Identity
{
@@ -58,5 +59,19 @@
}
return result;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class PassThroughResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
#region IResultTransformer Members
public object TransformTuple(object[] tuple, string[] aliases)
@@ -19,5 +21,19 @@
}
#endregion
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class RootEntityResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
return tuple[tuple.Length - 1];
@@ -15,5 +17,19 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -10,6 +10,8 @@
[Serializable]
public class ToListResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
return new ArrayList(tuple);
@@ -19,5 +21,19 @@
{
return list;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 15:41:52 UTC (rev 5795)
@@ -856,6 +856,7 @@
<Compile Include="TestDialect.cs" />
<Compile Include="TestDialects\PostgreSQL82TestDialect.cs" />
<Compile Include="TestDialects\SQLiteTestDialect.cs" />
+ <Compile Include="TransformTests\ImplementationOfEqualityTests.cs" />
<Compile Include="TypesTest\CharClass.cs" />
<Compile Include="TypesTest\CharClassFixture.cs" />
<Compile Include="TypesTest\DateTimeClass.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using NHibernate.Linq;
+using NHibernate.Transform;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.TransformTests
+{
+ public class ImplementationOfEqualityTests
+ {
+ private readonly IEnumerable<System.Type> transformerTypes = typeof(IResultTransformer).Assembly.GetTypes().Where(t => typeof(IResultTransformer).IsAssignableFrom(t) && t.IsClass).ToList();
+
+ [Test]
+ public void AllEmbeddedTransformersOverridesEqualsAndGetHashCode()
+ {
+ foreach (var transformerType in transformerTypes)
+ {
+ var declaredMethods = transformerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
+ declaredMethods.Select(x => x.Name).Should("The type "+transformerType+" does not implement Equals").Contain("Equals");
+ declaredMethods.Select(x => x.Name).Should("The type " + transformerType + " does not implement GetHashCode").Contain("GetHashCode");
+ }
+ }
+
+ [Test]
+ public void AllEmbeddedTransformersWithDefaultCtorHasEqualityWorkingAsSingleton()
+ {
+ foreach (var transformerType in transformerTypes)
+ {
+ IResultTransformer transformer1;
+ try
+ {
+ transformer1 = (IResultTransformer)Activator.CreateInstance(transformerType);
+ }
+ catch (Exception e)
+ {
+ // The transformer does not have default ctor
+ Console.WriteLine(transformerType);
+ Console.WriteLine(e);
+ continue;
+ }
+ var transformer2= (IResultTransformer)Activator.CreateInstance(transformerType);
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+ }
+ }
+
+ [Test]
+ public void AliasToBeanResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ var transformer1 = new AliasToBeanResultTransformer(typeof(object));
+ var transformer2 = new AliasToBeanResultTransformer(typeof(object));
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ var transformer3 = new AliasToBeanResultTransformer(typeof(int));
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+
+ [Test]
+ public void AliasToBeanConstructorResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ var emptyCtor = new System.Type[0];
+ var transformer1 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor));
+ var transformer2 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor));
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ var transformer3 = new AliasToBeanConstructorResultTransformer(typeof(ImplementationOfEqualityTests).GetConstructor(emptyCtor));
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+
+ public delegate void DoNothingDelegate();
+ public delegate void DoNothingDelegate1();
+ [Test]
+ public void LinqResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ DoNothingDelegate d1 = () => { };
+ DoNothingDelegate d2 = () => { };
+ var transformer1 = new ResultTransformer(d1, d2);
+ var transformer2 = new ResultTransformer(d1, d2);
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ DoNothingDelegate1 d3 = () => { };
+ var transformer3 = new ResultTransformer(d1, d3);
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-02 14:27:05
|
Revision: 5794
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5794&view=rev
Author: fabiomaulo
Date: 2011-05-02 14:26:59 +0000 (Mon, 02 May 2011)
Log Message:
-----------
Fix NH-2685 and any other possible not safe call to the logger
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Logging.cs
trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs
Modified: trunk/nhibernate/src/NHibernate/Logging.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Logging.cs 2011-05-02 14:08:59 UTC (rev 5793)
+++ trunk/nhibernate/src/NHibernate/Logging.cs 2011-05-02 14:26:59 UTC (rev 5794)
@@ -374,72 +374,86 @@
public void Error(object message)
{
- ErrorDelegate(logger, message);
+ if (IsErrorEnabled)
+ ErrorDelegate(logger, message);
}
public void Error(object message, Exception exception)
{
- ErrorExceptionDelegate(logger,message,exception);
+ if (IsErrorEnabled)
+ ErrorExceptionDelegate(logger, message, exception);
}
public void ErrorFormat(string format, params object[] args)
{
- ErrorFormatDelegate(logger, format, args);
+ if (IsErrorEnabled)
+ ErrorFormatDelegate(logger, format, args);
}
public void Fatal(object message)
{
- FatalDelegate(logger, message);
+ if (IsFatalEnabled)
+ FatalDelegate(logger, message);
}
public void Fatal(object message, Exception exception)
{
- FatalExceptionDelegate(logger,message,exception);
+ if (IsFatalEnabled)
+ FatalExceptionDelegate(logger, message, exception);
}
public void Debug(object message)
{
- DebugDelegate(logger, message);
+ if (IsDebugEnabled)
+ DebugDelegate(logger, message);
}
public void Debug(object message, Exception exception)
{
- DebugExceptionDelegate(logger, message, exception);
+ if (IsDebugEnabled)
+ DebugExceptionDelegate(logger, message, exception);
}
public void DebugFormat(string format, params object[] args)
{
- DebugFormatDelegate(logger, format, args);
+ if (IsDebugEnabled)
+ DebugFormatDelegate(logger, format, args);
}
public void Info(object message)
{
- InfoDelegate(logger, message);
+ if (IsInfoEnabled)
+ InfoDelegate(logger, message);
}
public void Info(object message, Exception exception)
{
- InfoExceptionDelegate(logger, message, exception);
+ if (IsInfoEnabled)
+ InfoExceptionDelegate(logger, message, exception);
}
public void InfoFormat(string format, params object[] args)
{
- InfoFormatDelegate(logger, format, args);
+ if (IsInfoEnabled)
+ InfoFormatDelegate(logger, format, args);
}
public void Warn(object message)
{
- WarnDelegate(logger, message);
+ if (IsWarnEnabled)
+ WarnDelegate(logger, message);
}
public void Warn(object message, Exception exception)
{
- WarnExceptionDelegate(logger, message, exception);
+ if (IsWarnEnabled)
+ WarnExceptionDelegate(logger, message, exception);
}
public void WarnFormat(string format, params object[] args)
{
- WarnFormatDelegate(logger, format, args);
+ if (IsWarnEnabled)
+ WarnFormatDelegate(logger, format, args);
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs 2011-05-02 14:08:59 UTC (rev 5793)
+++ trunk/nhibernate/src/NHibernate.Test/Logging/Log4NetLoggerTest.cs 2011-05-02 14:26:59 UTC (rev 5794)
@@ -214,7 +214,7 @@
get
{
isDebugEnabled++;
- return false;
+ return true;
}
}
@@ -223,7 +223,7 @@
get
{
isInfoEnabled++;
- return false;
+ return true;
}
}
@@ -232,7 +232,7 @@
get
{
isWarnEnabled++;
- return false;
+ return true;
}
}
@@ -241,7 +241,7 @@
get
{
isErrorEnabled++;
- return false;
+ return true;
}
}
@@ -250,7 +250,7 @@
get
{
isFatalEnabled++;
- return false;
+ return true;
}
}
}
@@ -299,11 +299,11 @@
logMock.errorFormat.Should().Be(1);
logMock.fatal.Should().Be(1);
logMock.fatalException.Should().Be(1);
- logMock.isDebugEnabled.Should().Be(1);
- logMock.isInfoEnabled.Should().Be(1);
- logMock.isWarnEnabled.Should().Be(1);
- logMock.isErrorEnabled.Should().Be(1);
- logMock.isFatalEnabled.Should().Be(1);
+ logMock.isDebugEnabled.Should().Be.GreaterThan(1);
+ logMock.isInfoEnabled.Should().Be.GreaterThan(1);
+ logMock.isWarnEnabled.Should().Be.GreaterThan(1);
+ logMock.isErrorEnabled.Should().Be.GreaterThan(1);
+ logMock.isFatalEnabled.Should().Be.GreaterThan(1);
}
}
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-02 14:09:06
|
Revision: 5793
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5793&view=rev
Author: fabiomaulo
Date: 2011-05-02 14:08:59 +0000 (Mon, 02 May 2011)
Log Message:
-----------
Fix NH-2673, NH-1090, NH-1344
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs
trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs
trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs
trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs
trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs
trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs
trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs
trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs
trunk/nhibernate/src/NHibernate/Loader/Loader.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs
Modified: trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Cache/QueryKey.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -61,6 +61,11 @@
hashCode = ComputeHashCode();
}
+ public bool HasResultTrasformer
+ {
+ get { return customTransformer != null; }
+ }
+
public QueryKey SetFirstRows(int[] firstRows)
{
multiQueriesFirstRows = firstRows;
Modified: trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -77,7 +77,7 @@
IList cacheable = new List<object>(result.Count + 1) {ts};
for (int i = 0; i < result.Count; i++)
{
- if (returnTypes.Length == 1)
+ if (returnTypes.Length == 1 && !key.HasResultTrasformer)
{
cacheable.Add(returnTypes[0].Disassemble(result[i], session, null));
}
Modified: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/CacheConfiguration.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -35,15 +35,21 @@
public void Provider<TProvider>() where TProvider : ICacheProvider
{
- cfg.SetProperty(Environment.CacheProvider, typeof (TProvider).AssemblyQualifiedName);
+ UseSecondLevelCache = true;
+ cfg.SetProperty(Environment.CacheProvider, typeof(TProvider).AssemblyQualifiedName);
}
public void QueryCache<TFactory>() where TFactory : IQueryCache
{
+ UseSecondLevelCache = true;
UseQueryCache = true;
cfg.SetProperty(Environment.QueryCacheFactory, typeof(TFactory).AssemblyQualifiedName);
}
+ private bool UseSecondLevelCache
+ {
+ set { cfg.SetProperty(Environment.UseSecondLevelCache, value.ToString().ToLowerInvariant()); }
+ }
#endregion
}
@@ -66,6 +72,7 @@
public ICacheConfiguration Through<TProvider>() where TProvider : ICacheProvider
{
+ fc.Configuration.SetProperty(Environment.UseSecondLevelCache, "true");
fc.Configuration.SetProperty(Environment.CacheProvider, typeof(TProvider).AssemblyQualifiedName);
return this;
}
@@ -106,6 +113,8 @@
public ICacheConfiguration Through<TFactory>() where TFactory : IQueryCache
{
+ cc.Configuration.SetProperty(Environment.UseSecondLevelCache, "true");
+ cc.Configuration.SetProperty(Environment.UseQueryCache, "true");
cc.Configuration.SetProperty(Environment.QueryCacheFactory, typeof(TFactory).AssemblyQualifiedName);
return cc;
}
Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Loader/QueryLoader.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -300,7 +300,7 @@
return List(session, queryParameters, _queryTranslator.QuerySpaces, _queryReturnTypes);
}
- protected override IList GetResultList(IList results, IResultTransformer resultTransformer)
+ public override IList GetResultList(IList results, IResultTransformer resultTransformer)
{
// meant to handle dynamic instantiation queries...
HolderInstantiator holderInstantiator = HolderInstantiator.GetHolderInstantiator(_selectNewTransformer,
Modified: trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -1512,7 +1512,7 @@
}
}
- protected override IList GetResultList(IList results, IResultTransformer resultTransformer)
+ public override IList GetResultList(IList results, IResultTransformer resultTransformer)
{
HolderInstantiator holderInstantiator =
HolderInstantiator.CreateClassicHolderInstantiator(holderConstructor, resultTransformer);
Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -26,7 +26,7 @@
private int timeout = RowSelection.NoValue;
private int fetchSize = RowSelection.NoValue;
private ISessionImplementor session;
- private IResultTransformer resultTransformer = CriteriaSpecification.RootEntity;
+ private IResultTransformer resultTransformer;
private bool cacheable;
private string cacheRegion;
private CacheMode? cacheMode;
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -14,6 +14,7 @@
using NHibernate.SqlCommand;
using NHibernate.Transform;
using NHibernate.Type;
+using NHibernate.Util;
namespace NHibernate.Impl
{
@@ -91,7 +92,6 @@
}
}
-
private IList ListUsingQueryCache()
{
IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion);
@@ -141,21 +141,28 @@
protected virtual IList GetResultList(IList results)
{
- if (resultTransformer != null)
+ for (int i = 0; i < loaders.Count; i++)
{
- for (int i = 0; i < results.Count; i++)
+ CriteriaLoader loader = loaders[i];
+ results[i] = loader.GetResultList((IList)results[i], parameters[i].ResultTransformer);
+ IList tmpResults;
+ if (resultCollectionGenericType[i] == typeof (object))
{
- results[i] = resultTransformer.TransformList((IList)results[i]);
+ tmpResults = new ArrayList();
}
+ else
+ {
+ tmpResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i]));
+ }
+ ArrayHelper.AddAll(tmpResults, (IList)results[i]);
+
+ results[i] = tmpResults;
}
- else
+ if (resultTransformer != null)
{
for (int i = 0; i < results.Count; i++)
{
- CriteriaImpl critImp = criteriaQueries[i] as CriteriaImpl;
- if (critImp == null || critImp.ResultTransformer == null)
- continue;
- results[i] = critImp.ResultTransformer.TransformList((IList)results[i]);
+ results[i] = resultTransformer.TransformList((IList)results[i]);
}
}
return results;
@@ -205,15 +212,7 @@
hydratedObjects[i] = entitySpan == 0 ? null : new ArrayList(entitySpan);
EntityKey[] keys = new EntityKey[entitySpan];
QueryParameters queryParameters = parameters[i];
- IList tmpResults;
- if (resultCollectionGenericType[i] == typeof(object))
- {
- tmpResults = new ArrayList();
- }
- else
- {
- tmpResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i]));
- }
+ IList tmpResults = new ArrayList();
RowSelection selection = parameters[i].RowSelection;
createSubselects[i] = loader.IsSubselectLoadingEnabled;
@@ -238,6 +237,7 @@
}
tmpResults.Add(o);
}
+
results.Add(tmpResults);
reader.NextResult();
}
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -453,7 +453,8 @@
for (int i = 0; i < len; ++i)
{
// First use the transformer of each query transformig each row and then the list
- results[i] = GetTransformedResults((IList)results[i], GetQueryHolderInstantiator(i));
+ // DONE: The behavior when the query has a 'new' istead a trasformer is delegated to the Loader
+ results[i] = translators[i].Loader.GetResultList((IList)results[i], Parameters[i].ResultTransformer);
// then use the MultiQueryTransformer (if it has some sense...) using, as source, the transformed result.
results[i] = GetTransformedResults((IList)results[i], multiqueryHolderInstatiator);
}
@@ -475,15 +476,6 @@
return holderInstantiator.ResultTransformer.TransformList(source);
}
- private HolderInstantiator GetQueryHolderInstantiator(int queryPosition)
- {
- // TODO : we need a test to check the behavior when the query has a 'new' istead a trasformer
- // we should take the HolderInstantiator directly from QueryTranslator... taking care with Parameters.
- return Parameters[queryPosition].ResultTransformer != null ?
- new HolderInstantiator(Parameters[queryPosition].ResultTransformer, translators[queryPosition].ReturnAliases)
- : HolderInstantiator.NoopInstantiator;
- }
-
private HolderInstantiator GetMultiQueryHolderInstatiator()
{
return HasMultiQueryResultTrasformer() ? new HolderInstantiator(resultTransformer, null) : HolderInstantiator.NoopInstantiator;
Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Data;
using Iesi.Collections.Generic;
+using NHibernate.Criterion;
using NHibernate.Engine;
using NHibernate.Impl;
using NHibernate.Persister.Entity;
@@ -78,7 +79,6 @@
ISessionImplementor session)
{
object[] result;
- string[] aliases;
if (translator.HasProjection)
{
@@ -101,14 +101,17 @@
}
position += numColumns;
}
- aliases = translator.ProjectedAliases;
}
else
{
result = row;
- aliases = userAliases;
}
- return translator.RootCriteria.ResultTransformer.TransformTuple(result, aliases);
+
+ if (resultTransformer == null && result.Length == 1)
+ {
+ return result[0];
+ }
+ return result;
}
protected override SqlString ApplyLocks(SqlString sqlSelectString, IDictionary<string, LockMode> lockModes,
@@ -161,9 +164,20 @@
return lockModesArray;
}
- protected override IList GetResultList(IList results, IResultTransformer resultTransformer)
+ public override IList GetResultList(IList results, IResultTransformer resultTransformer)
{
- return translator.RootCriteria.ResultTransformer.TransformList(results);
+ var transformer = resultTransformer ?? CriteriaSpecification.RootEntity;
+ for (int i = 0; i < results.Count; i++)
+ {
+ var row = results[i] as object[];
+ if(row == null)
+ {
+ row = new object[] { results[i] };
+ }
+ object result = transformer.TransformTuple(row, translator.HasProjection ? translator.ProjectedAliases : userAliases);
+ results[i] = result;
+ }
+ return transformer.TransformList(results);
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Loader/Custom/CustomLoader.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -280,7 +280,7 @@
return rowProcessor.BuildResultRow(row, rs, resultTransformer != null, session);
}
- protected override IList GetResultList(IList results, IResultTransformer resultTransformer)
+ public override IList GetResultList(IList results, IResultTransformer resultTransformer)
{
// meant to handle dynamic instantiation queries...(Copy from QueryLoader)
HolderInstantiator holderInstantiator =
Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-04-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -628,7 +628,7 @@
collectionPersister);
}
- protected virtual IList GetResultList(IList results, IResultTransformer resultTransformer)
+ public virtual IList GetResultList(IList results, IResultTransformer resultTransformer)
{
return results;
}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/Blog.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -0,0 +1,34 @@
+using Iesi.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.NH2673
+{
+ public class Blog
+ {
+ public Blog()
+ {
+ Posts = new HashedSet<Post>();
+ Comments = new HashedSet<Comment>();
+ }
+
+ public virtual int Id { get; set; }
+ public virtual string Author { get; set; }
+ public virtual string Name { get; set; }
+ public virtual ISet<Post> Posts { get; set; }
+ public virtual ISet<Comment> Comments { get; set; }
+ }
+
+ public class Post
+ {
+ public virtual int Id { get; protected set; }
+ public virtual string Title { get; set; }
+ public virtual string Body { get; set; }
+ }
+
+
+ public class Comment
+ {
+ public virtual int Id { get; protected set; }
+ public virtual string Title { get; set; }
+ public virtual string Body { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2673/CachingWithTrasformerTests.cs 2011-05-02 14:08:59 UTC (rev 5793)
@@ -0,0 +1,157 @@
+using System;
+using System.Collections;
+using NHibernate.Cache;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Transform;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2673
+{
+ public class CachingWithTrasformerTests: TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ConventionModelMapper();
+ mapper.BeforeMapClass += (inspector, type, map) => map.Id(x => x.Generator(Generators.HighLow));
+ mapper.BeforeMapClass += (inspector, type, map) => map.Cache(x => x.Usage(CacheUsage.ReadWrite));
+ mapper.BeforeMapSet += (inspector, property, map) =>
+ {
+ map.Cascade(Mapping.ByCode.Cascade.All);
+ map.Cache(x => x.Usage(CacheUsage.ReadWrite));
+ };
+ var mapping = mapper.CompileMappingFor(new[] { typeof(Blog), typeof(Post), typeof(Comment) });
+ return mapping;
+ }
+
+ protected override void Configure(Cfg.Configuration configuration)
+ {
+ configuration.Cache(x =>
+ {
+ x.Provider<HashtableCacheProvider>();
+ x.UseQueryCache = true;
+ });
+ }
+
+ private class Scenario: IDisposable
+ {
+ private readonly ISessionFactory factory;
+
+ public Scenario(ISessionFactory factory)
+ {
+ this.factory = factory;
+ using (var session= factory.OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var blog = new Blog { Author = "Gabriel", Name = "Keep on running" };
+ blog.Posts.Add(new Post { Title = "First post", Body = "Some text" });
+ blog.Posts.Add(new Post { Title = "Second post", Body = "Some other text" });
+ blog.Posts.Add(new Post { Title = "Third post", Body = "Third post text" });
+
+
+ blog.Comments.Add(new Comment { Title = "First comment", Body = "Some text" });
+ blog.Comments.Add(new Comment { Title = "Second comment", Body = "Some other text" });
+ session.Save(blog);
+ tx.Commit();
+ }
+ }
+
+ public void Dispose()
+ {
+ using (var session = factory.OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ session.CreateQuery("delete from Comment").ExecuteUpdate();
+ session.CreateQuery("delete from Post").ExecuteUpdate();
+ session.CreateQuery("delete from Blog").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+ }
+
+ [Test]
+ public void WhenQueryThenNotThrows()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var query = session.CreateQuery("from Blog b where b.Author = : author")
+ .SetString("author", "Gabriel")
+ .SetCacheable(true)
+ .SetResultTransformer(new DistinctRootEntityResultTransformer());
+ query.Executing(q=> q.List<Blog>()).NotThrows();
+ tx.Commit();
+ }
+ }
+ }
+
+ [Test]
+ public void WhenCriteriaThenNotThrows()
+ {
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var query = session.QueryOver<Blog>().Where(x => x.Author == "Gabriel")
+ .TransformUsing(new DistinctRootEntityResultTransformer())
+ .Cacheable();
+ query.Executing(q => q.List<Blog>()).NotThrows();
+ tx.Commit();
+ }
+ }
+ }
+
+ private class BlogAuthorDto
+ {
+ public string BlogName { get; set; }
+ public string AuthorName { get; set; }
+ }
+
+ private class BlogAuthorTrasformer : IResultTransformer
+ {
+ public object TransformTuple(object[] tuple, string[] aliases)
+ {
+ return new BlogAuthorDto { BlogName = tuple[0].ToString(), AuthorName = tuple[1].ToString() };
+ }
+
+ public IList TransformList(IList collection)
+ {
+ return collection;
+ }
+ }
+
+ [Test]
+ public void WhenCriteriaProjectionThenNotThrows()
+ {
+ // during the fix of NH-2673 was faund another bug related to cacheability of criteria with projection + trasformer
+ // then found reported as NH-1090
+ var transformer = new BlogAuthorTrasformer();
+ using (new Scenario(Sfi))
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var query = session.QueryOver<Blog>().Select(x=> x.Author, x=> x.Name).Where(x => x.Author == "Gabriel")
+ .TransformUsing(transformer)
+ .Cacheable();
+ query.List<BlogAuthorDto>();
+ tx.Commit();
+ }
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var query = session.QueryOver<Blog>().Select(x => x.Author, x => x.Name).Where(x => x.Author == "Gabriel")
+ .TransformUsing(transformer)
+ .Cacheable();
+ query.Executing(q => q.List<BlogAuthorDto>()).NotThrows();
+ tx.Commit();
+ }
+ }
+ }
+ }
+}
\ 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-29 22:51:08 UTC (rev 5792)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 14:08:59 UTC (rev 5793)
@@ -810,6 +810,8 @@
<Compile Include="NHSpecificTest\NH2632\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2660And2661\DomainClass.cs" />
<Compile Include="NHSpecificTest\NH2660And2661\Test.cs" />
+ <Compile Include="NHSpecificTest\NH2673\Blog.cs" />
+ <Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" />
<Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" />
<Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" />
<Compile Include="NHSpecificTest\Properties\Model.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-29 22:51:14
|
Revision: 5792
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5792&view=rev
Author: fabiomaulo
Date: 2011-04-29 22:51:08 +0000 (Fri, 29 Apr 2011)
Log Message:
-----------
not visible checking declared types
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 22:51:08 UTC (rev 5792)
@@ -18,6 +18,9 @@
throw new ArgumentNullException("explicitDeclarationsHolder");
}
explicitDeclarationsHolder.AddAsRootEntity(typeof (TEntity));
+
+ // Add an empty customizer as a way to register the class as explicity declared
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => { });
}
private Dictionary<string, IJoinMapper<TEntity>> JoinCustomizers
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 22:51:08 UTC (rev 5792)
@@ -55,7 +55,7 @@
{
// even seems repetitive, before unify this registration with the registration using Expression take in account that reflection operations
// done unsing expressions are faster than those done with pure reflection.
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegistePropertyMapping(mapping, member, memberOf);
}
@@ -346,7 +346,13 @@
public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType();
+ if(!typeof(TElement).Equals(collectionElementType))
+ {
+ throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof (TEntity).FullName, typeof (TElement).Name, collectionElementType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
@@ -358,7 +364,13 @@
public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType();
+ if (!typeof(TElement).Equals(collectionElementType))
+ {
+ throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
@@ -370,7 +382,13 @@
public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType();
+ if (!typeof(TElement).Equals(collectionElementType))
+ {
+ throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
@@ -382,7 +400,15 @@
public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var propertyOrFieldType = member.GetPropertyOrFieldType();
+ var keyType = propertyOrFieldType.DetermineDictionaryKeyType();
+ var collectionElementType = propertyOrFieldType.DetermineDictionaryValueType();
+ if (!typeof(TElement).Equals(collectionElementType) || !typeof(TKey).Equals(keyType))
+ {
+ throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a dictionary of {2}/{3} but was {4}/{5}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TKey).Name, keyType.Name ,typeof(TElement).Name, collectionElementType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf);
}
@@ -399,7 +425,13 @@
public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var collectionElementType = member.GetPropertyOrFieldType().DetermineCollectionElementType();
+ if (!typeof(TElement).Equals(collectionElementType))
+ {
+ throw new MappingException(string.Format("Wrong collection element type. For the property/field '{0}' of {1} was expected a collection of {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TElement).Name, collectionElementType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
@@ -411,14 +443,26 @@
public void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var propertyOrFieldType = member.GetPropertyOrFieldType();
+ if (!typeof(TProperty).Equals(propertyOrFieldType))
+ {
+ throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a many-to-one with {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterManyToOneMapping<TProperty>(mapping, member, memberOf);
}
public void Component<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentMapper<TComponent>> mapping) where TComponent : class
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var propertyOrFieldType = member.GetPropertyOrFieldType();
+ if (!typeof(TComponent).Equals(propertyOrFieldType))
+ {
+ throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a component of {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TComponent).Name, propertyOrFieldType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterComponentMapping<TComponent>(mapping, member, memberOf);
}
@@ -430,23 +474,45 @@
public void Component<TComponent>(string notVidiblePropertyOrFieldName, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf);
}
public void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var propertyOrFieldType = member.GetPropertyOrFieldType();
+ if (!typeof(TProperty).Equals(propertyOrFieldType))
+ {
+ throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a heterogeneous (any) of type {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf);
}
public void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class
{
- MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo member = GetPropertyOrFieldMatchingNameOrThrow(notVidiblePropertyOrFieldName);
+ var propertyOrFieldType = member.GetPropertyOrFieldType();
+ if (!typeof(TProperty).Equals(propertyOrFieldType))
+ {
+ throw new MappingException(string.Format("Wrong relation type. For the property/field '{0}' of {1} was expected a one-to-one with {2} but was {3}",
+ notVidiblePropertyOrFieldName, typeof(TEntity).FullName, typeof(TProperty).Name, propertyOrFieldType.Name));
+ }
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
RegisterOneToOneMapping<TProperty>(mapping, member, memberOf);
}
+
+ public static MemberInfo GetPropertyOrFieldMatchingNameOrThrow(string memberName)
+ {
+ var result = typeof(TEntity).GetPropertyOrFieldMatchingName(memberName);
+ if (result == null)
+ {
+ throw new MappingException(string.Format("Member not found. The member '{0}' does not exists in type {1}", memberName, typeof(TEntity).FullName));
+ }
+ return result;
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 21:31:40 UTC (rev 5791)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 22:51:08 UTC (rev 5792)
@@ -214,10 +214,10 @@
BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
var modelInspector = (IModelInspector) this;
- return !subject.IsEnum && !subject.Namespace.StartsWith("System") /* hack */&& !modelInspector.IsEntity(subject)
- &&
- !subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat(
- subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m));
+ return !subject.IsEnum && (subject.Namespace == null || !subject.Namespace.StartsWith("System")) /* hack */
+ && !modelInspector.IsEntity(subject)
+ && !subject.GetProperties(flattenHierarchyMembers).Cast<MemberInfo>().Concat(
+ subject.GetFields(flattenHierarchyMembers)).Any(m => modelInspector.IsPersistentId(m));
}
protected bool MatchEntity(System.Type subject)
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 21:31:40 UTC (rev 5791)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 22:51:08 UTC (rev 5792)
@@ -154,8 +154,9 @@
// ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class.
// NH have to recognize the case and map those properties in the inherited.
var inspector = new SimpleModelInspector();
+ inspector.IsEntity((type, declared) => type == typeof(Inherited));
inspector.IsRootEntity((type, declared) => type == typeof(Inherited));
- var mapper = new ModelMapper();
+ var mapper = new ModelMapper(inspector);
mapper.Class<MyClass>(mc =>
{
mc.Id(x => x.Id);
@@ -225,8 +226,9 @@
// ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class.
// NH have to recognize the case and map those properties in the inherited.
var inspector = new SimpleModelInspector();
- inspector.IsRootEntity((type, declared) => type == typeof (Inherited));
- var mapper = new ModelMapper();
+ inspector.IsEntity((type, declared) => type == typeof(Inherited));
+ inspector.IsRootEntity((type, declared) => type == typeof(Inherited));
+ var mapper = new ModelMapper(inspector);
mapper.Class<MyClass>(mc =>
{
mc.Id(x => x.Id);
@@ -256,5 +258,126 @@
"DynamicCompo");
hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field.")));
}
+
+ [Test]
+ public void WhenMapBagWithWrongElementTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Bag<int>("Bag", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapIdBagWithWrongElementTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.IdBag<int>("IdBag", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapSetWithWrongElementTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Set<int>("Set", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapListWithWrongElementTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Set<int>("Set", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapDictionaryWithWrongKeyTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Map<string, string>("Map", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapDictionaryWithWrongValueTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Map<int, int>("Map", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapComponentWithWrongElementTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Component<object>("Compo", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+
+ [Test]
+ public void WhenMapOneToOneWithWrongTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.OneToOne<object>("OneToOne", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapManyToOneWithWrongTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.ManyToOne<object>("ManyToOne", y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
+
+ [Test]
+ public void WhenMapAnyWithWrongTypeThenThrows()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Any<Related>("Any", typeof(int),y => y.Access(Accessor.Field));
+ })).Should().Throw<MappingException>();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:31:40 UTC (rev 5791)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 22:51:08 UTC (rev 5792)
@@ -48,5 +48,16 @@
hbmProperty.access.Should().Be("field");
hbmProperty.length.Should().Be("150");
}
+
+ [Test]
+ public void WhenPrivateMemberDoesNotExistsThenThrow()
+ {
+ var mapper = new ModelMapper();
+ Executing.This(() =>
+ mapper.Class<MyClass>(ca =>
+ {
+ ca.Property("pizza", map => map.Length(150));
+ })).Should().Throw<MappingException>();
+ }
}
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-29 21:31:46
|
Revision: 5791
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5791&view=rev
Author: fabiomaulo
Date: 2011-04-29 21:31:40 +0000 (Fri, 29 Apr 2011)
Log Message:
-----------
Class Customizers with mapping of not visible id/version
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-29 21:16:22 UTC (rev 5790)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-29 21:31:40 UTC (rev 5791)
@@ -40,10 +40,12 @@
{
void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty);
void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper);
- void Id(FieldInfo idProperty, Action<IIdMapper> idMapper);
+ void Id(string notVidiblePropertyOrFieldName, Action<IIdMapper> idMapper);
void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class;
void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class;
+ void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class;
+ void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class;
void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping);
@@ -54,6 +56,7 @@
void Schema(string schemaName);
void Mutable(bool isMutable);
void Version<TProperty>(Expression<Func<TEntity, TProperty>> versionProperty, Action<IVersionMapper> versionMapping);
+ void Version(string notVidiblePropertyOrFieldName, Action<IVersionMapper> versionMapping);
void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping, Action<INaturalIdAttributesMapper> naturalIdMapping);
void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping);
void Cache(Action<ICacheMapper> cacheMapping);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:16:22 UTC (rev 5790)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-29 21:31:40 UTC (rev 5791)
@@ -43,13 +43,15 @@
CustomizersHolder.AddCustomizer(typeof (TEntity), m => m.Id(member, idMapper));
}
- public void Id(FieldInfo idProperty, Action<IIdMapper> idMapper)
+ public void Id(string notVidiblePropertyOrFieldName, Action<IIdMapper> idMapper)
{
- if (idProperty != null)
+ MemberInfo member = null;
+ if (notVidiblePropertyOrFieldName != null)
{
- ExplicitDeclarationsHolder.AddAsPoid(idProperty);
+ member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ ExplicitDeclarationsHolder.AddAsPoid(member);
}
- CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(idProperty, idMapper));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(member, idMapper));
}
public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class
@@ -64,6 +66,18 @@
idMapper(new ComponentAsIdCustomizer<TComponent>(ExplicitDeclarationsHolder, CustomizersHolder, propertyPath));
}
+ public void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class
+ {
+ ComponentAsId<TComponent>(notVidiblePropertyOrFieldName, x => { });
+ }
+
+ public void ComponentAsId<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class
+ {
+ var member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ var propertyPath = new PropertyPath(null, member);
+ idMapper(new ComponentAsIdCustomizer<TComponent>(ExplicitDeclarationsHolder, CustomizersHolder, propertyPath));
+ }
+
public void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping)
{
idPropertiesMapping(new ComposedIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder));
@@ -110,6 +124,13 @@
CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Version(member, versionMapping));
}
+ public void Version(string notVidiblePropertyOrFieldName, Action<IVersionMapper> versionMapping)
+ {
+ var member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ ExplicitDeclarationsHolder.AddAsVersionProperty(member);
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Version(member, versionMapping));
+ }
+
public void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping, Action<INaturalIdAttributesMapper> naturalIdMapping)
{
naturalIdPropertiesMapping(new NaturalIdCustomizer<TEntity>(ExplicitDeclarationsHolder, CustomizersHolder));
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:16:22 UTC (rev 5790)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 21:31:40 UTC (rev 5791)
@@ -11,6 +11,7 @@
public class MyClass
{
private int id;
+ private int version;
private string something;
}
@@ -20,11 +21,12 @@
var mapper = new ModelMapper();
mapper.Class<MyClass>(ca =>
{
- ca.Id(ForClass<MyClass>.Field("id"), map =>
+ ca.Id("id", map =>
{
map.Column("MyClassId");
map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 }));
});
+ ca.Version("version", map => { });
ca.Property("something", map => map.Length(150));
});
var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
@@ -39,6 +41,8 @@
hbm...@cl...().Be("hilo");
hbmGenerator.param[0].name.Should().Be("max_low");
hbmGenerator.param[0].GetText().Should().Be("100");
+ var hbmVersion = hbmClass.Version;
+ hbmVersion.name.Should().Be("version");
var hbmProperty = hbmClass.Properties.OfType<HbmProperty>().Single();
hbmProperty.name.Should().Be("something");
hbmProperty.access.Should().Be("field");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-29 21:16:29
|
Revision: 5790
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5790&view=rev
Author: fabiomaulo
Date: 2011-04-29 21:16:22 +0000 (Fri, 29 Apr 2011)
Log Message:
-----------
Customizers with mapping of not visible members
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 21:16:22 UTC (rev 5790)
@@ -32,6 +32,7 @@
void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class;
void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class;
+ void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class;
}
public interface IBasePlainPropertyContainerMapper<TContainer> : IMinimalPlainPropertyContainerMapper<TContainer>
@@ -39,16 +40,24 @@
void Component<TComponent>(Expression<Func<TContainer, TComponent>> property,
Action<IComponentMapper<TComponent>> mapping) where TComponent : class;
void Component<TComponent>(Expression<Func<TContainer, TComponent>> property) where TComponent : class;
-
void Component<TComponent>(Expression<Func<TContainer, IDictionary>> property,
TComponent dynamicComponentTemplate,
Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class;
+ void Component<TComponent>(string notVidiblePropertyOrFieldName,
+ Action<IComponentMapper<TComponent>> mapping) where TComponent : class;
+ void Component<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class;
+ void Component<TComponent>(string notVidiblePropertyOrFieldName,
+ TComponent dynamicComponentTemplate,
+ Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class;
+
void Any<TProperty>(Expression<Func<TContainer, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class;
+ void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class;
}
public interface IPlainPropertyContainerMapper<TContainer> : IBasePlainPropertyContainerMapper<TContainer>
{
void OneToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IOneToOneMapper> mapping) where TProperty : class;
+ void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class;
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPropertyContainerMapper.cs 2011-04-29 21:16:22 UTC (rev 5790)
@@ -33,35 +33,63 @@
Action<ICollectionElementRelation<TElement>> mapping);
void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping);
+ void Set<TElement>(string notVidiblePropertyOrFieldName,
+ Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void Set<TElement>(string notVidiblePropertyOrFieldName,
+ Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping);
void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping);
void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping);
+ void Bag<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void Bag<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping);
void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping);
void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping);
+ void List<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void List<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping);
void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
Action<IMapKeyRelation<TKey>> keyMapping,
Action<ICollectionElementRelation<TElement>> mapping);
-
void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping);
void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping);
+ void Map<TKey, TElement>(string notVidiblePropertyOrFieldName,
+ Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
+ Action<IMapKeyRelation<TKey>> keyMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void Map<TKey, TElement>(string notVidiblePropertyOrFieldName,
+ Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void Map<TKey, TElement>(string notVidiblePropertyOrFieldName,
+ Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping);
void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping);
void IdBag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping);
+ void IdBag<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping,
+ Action<ICollectionElementRelation<TElement>> mapping);
+ void IdBag<TElement>(string notVidiblePropertyOrFieldName,
+ Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping);
}
public interface IPropertyContainerMapper<TEntity> : ICollectionPropertiesContainerMapper<TEntity>, IPlainPropertyContainerMapper<TEntity> where TEntity : class {}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 21:16:22 UTC (rev 5790)
@@ -43,10 +43,7 @@
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
- explicitDeclarationsHolder.AddAsProperty(member);
- explicitDeclarationsHolder.AddAsProperty(memberOf);
+ RegistePropertyMapping(mapping, member, memberOf);
}
public void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping)
@@ -60,12 +57,18 @@
// done unsing expressions are faster than those done with pure reflection.
MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
- explicitDeclarationsHolder.AddAsProperty(member);
- explicitDeclarationsHolder.AddAsProperty(memberOf);
+ RegistePropertyMapping(mapping, member, memberOf);
}
+ protected void RegistePropertyMapping(Action<IPropertyMapper> mapping, params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
+ explicitDeclarationsHolder.AddAsProperty(member);
+ }
+ }
+
public void Component<TComponent>(Expression<Func<TEntity, TComponent>> property,
Action<IComponentMapper<TComponent>> mapping) where TComponent : class
{
@@ -80,11 +83,19 @@
where TComponent : class
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member)));
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf)));
+ RegisterComponentMapping<TComponent>(mapping, member, memberOf);
}
+ protected void RegisterComponentMapping<TComponent>(Action<IComponentMapper<TComponent>> mapping, params MemberInfo[] members)
+ where TComponent : class
+ {
+ foreach (var member in members)
+ {
+ mapping(new ComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member)));
+ }
+ }
+
public void Component<TComponent>(Expression<Func<TEntity, IDictionary>> property,
TComponent dynamicComponentTemplate,
Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class
@@ -95,11 +106,19 @@
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)));
+ RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf);
}
+ protected void RegisterDynamicComponentMapping<TComponent>(Action<IDynamicComponentMapper<TComponent>> mapping, params MemberInfo[] members)
+ where TComponent : class
+ {
+ foreach (var member in members)
+ {
+ mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member)));
+ }
+ }
+
public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping)
where TProperty : class
{
@@ -110,13 +129,20 @@
where TProperty : class
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
- explicitDeclarationsHolder.AddAsManyToOneRelation(member);
- explicitDeclarationsHolder.AddAsManyToOneRelation(memberOf);
+ RegisterManyToOneMapping<TProperty>(mapping, member, memberOf);
}
+ protected void RegisterManyToOneMapping<TProperty>(Action<IManyToOneMapper> mapping, params MemberInfo[] members)
+ where TProperty : class
+ {
+ foreach (var member in members)
+ {
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
+ explicitDeclarationsHolder.AddAsManyToOneRelation(member);
+ }
+ }
+
public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property) where TProperty : class
{
ManyToOne(property, x => { });
@@ -126,13 +152,20 @@
where TProperty : class
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
- explicitDeclarationsHolder.AddAsOneToOneRelation(member);
- explicitDeclarationsHolder.AddAsOneToOneRelation(memberOf);
+ RegisterOneToOneMapping<TProperty>(mapping, member, memberOf);
}
+ protected void RegisterOneToOneMapping<TProperty>(Action<IOneToOneMapper> mapping, params MemberInfo[] members)
+ where TProperty : class
+ {
+ foreach (var member in members)
+ {
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
+ explicitDeclarationsHolder.AddAsOneToOneRelation(member);
+ }
+ }
+
public void Any<TProperty>(Expression<Func<TEntity, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping)
where TProperty : class
{
@@ -143,15 +176,22 @@
where TProperty : class
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), am => am.IdType(idTypeOfMetaType));
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
- CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), am => am.IdType(idTypeOfMetaType));
- explicitDeclarationsHolder.AddAsAny(member);
- explicitDeclarationsHolder.AddAsAny(memberOf);
+ RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf);
}
+ protected void RegisterAnyMapping<TProperty>(Action<IAnyMapper> mapping, System.Type idTypeOfMetaType, params MemberInfo[] members)
+ where TProperty : class
+ {
+ foreach (var member in members)
+ {
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), am => am.IdType(idTypeOfMetaType));
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
+
+ explicitDeclarationsHolder.AddAsAny(member);
+ }
+ }
+
public void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
@@ -168,14 +208,19 @@
protected virtual void RegisterSetMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- collectionMapping(new SetPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
-
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- collectionMapping(new SetPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
+ protected void RegisterSetMapping<TElement>(Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ collectionMapping(new SetPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
+ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ }
+ }
+
public void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
@@ -191,14 +236,19 @@
protected virtual void RegisterBagMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- collectionMapping(new BagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
-
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- collectionMapping(new BagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder));
+ RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
+ protected void RegisterBagMapping<TElement>(Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ collectionMapping(new BagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
+ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ }
+ }
+
public void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
@@ -214,14 +264,19 @@
protected virtual void RegisterListMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- collectionMapping(new ListPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
-
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- collectionMapping(new ListPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
+ protected void RegisterListMapping<TElement>(Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ collectionMapping(new ListPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
+ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ }
+ }
+
public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
Action<IMapKeyRelation<TKey>> keyMapping,
@@ -238,18 +293,21 @@
protected virtual void RegisterMapMapping<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- var memberPath = new PropertyPath(PropertyPath, member);
- collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
- keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
-
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- var memberOfPath = new PropertyPath(PropertyPath, memberOf);
- collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder));
- keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder));
+ RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf);
}
+ protected virtual void RegisterMapMapping<TKey, TElement>(Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping, params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ var memberPath = new PropertyPath(PropertyPath, member);
+ collectionMapping(new MapPropertiesCustomizer<TEntity, TKey, TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
+ keyMapping(new MapKeyRelationCustomizer<TKey>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
+ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberPath, CustomizersHolder));
+ }
+ }
+
public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
@@ -273,12 +331,122 @@
protected virtual void RegisterIdBagMapping<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
- collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
-
MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property);
- collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, memberOf), CustomizersHolder));
- mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder));
+ RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
}
+
+ protected virtual void RegisterIdBagMapping<TElement>(Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping,params MemberInfo[] members)
+ {
+ foreach (var member in members)
+ {
+ collectionMapping(new IdBagPropertiesCustomizer<TEntity, TElement>(explicitDeclarationsHolder, new PropertyPath(null, member), CustomizersHolder));
+ mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
+ }
+ }
+
+ public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterSetMapping<TElement>(collectionMapping, mapping, member, memberOf);
+ }
+
+ public void Set<TElement>(string notVidiblePropertyOrFieldName, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping)
+ {
+ Set(notVidiblePropertyOrFieldName, collectionMapping, x => { });
+ }
+
+ public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
+ }
+
+ public void Bag<TElement>(string notVidiblePropertyOrFieldName, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping)
+ {
+ Bag(notVidiblePropertyOrFieldName, collectionMapping, x => { });
+ }
+
+ public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterListMapping<TElement>(collectionMapping, mapping, member, memberOf);
+ }
+
+ public void List<TElement>(string notVidiblePropertyOrFieldName, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping)
+ {
+ List(notVidiblePropertyOrFieldName, collectionMapping, x => { });
+ }
+
+ public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<IMapKeyRelation<TKey>> keyMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterMapMapping<TKey, TElement>(collectionMapping, keyMapping, mapping, member, memberOf);
+ }
+
+ public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ Map(notVidiblePropertyOrFieldName, collectionMapping, x => { }, mapping);
+ }
+
+ public void Map<TKey, TElement>(string notVidiblePropertyOrFieldName, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping)
+ {
+ Map(notVidiblePropertyOrFieldName, collectionMapping, x => { }, y => { });
+ }
+
+ public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterIdBagMapping<TElement>(collectionMapping, mapping, member, memberOf);
+ }
+
+ public void IdBag<TElement>(string notVidiblePropertyOrFieldName, Action<IIdBagPropertiesMapper<TEntity, TElement>> collectionMapping)
+ {
+ IdBag(notVidiblePropertyOrFieldName, collectionMapping, x => { });
+ }
+
+ public void ManyToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IManyToOneMapper> mapping) where TProperty : class
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterManyToOneMapping<TProperty>(mapping, member, memberOf);
+ }
+
+ public void Component<TComponent>(string notVidiblePropertyOrFieldName, Action<IComponentMapper<TComponent>> mapping) where TComponent : class
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterComponentMapping<TComponent>(mapping, member, memberOf);
+ }
+
+ public void Component<TComponent>(string notVidiblePropertyOrFieldName) where TComponent : class
+ {
+ Component<TComponent>(notVidiblePropertyOrFieldName, x => { });
+ }
+
+ public void Component<TComponent>(string notVidiblePropertyOrFieldName, TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterDynamicComponentMapping<TComponent>(mapping, member, memberOf);
+ }
+
+ public void Any<TProperty>(string notVidiblePropertyOrFieldName, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterAnyMapping<TProperty>(mapping, idTypeOfMetaType, member, memberOf);
+ }
+
+ public void OneToOne<TProperty>(string notVidiblePropertyOrFieldName, Action<IOneToOneMapper> mapping) where TProperty : class
+ {
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+ RegisterOneToOneMapping<TProperty>(mapping, member, memberOf);
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/AllPropertiesRegistrationTests.cs 2011-04-29 21:16:22 UTC (rev 5790)
@@ -0,0 +1,260 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ExpliticMappingTests
+{
+ public class AllPropertiesRegistrationTests
+ {
+ private class MyClass
+ {
+ public int Id { get; set; }
+ private int simple;
+ public int Simple
+ {
+ get { return simple; }
+ set { simple = value; }
+ }
+
+ private IList<string> complexType;
+ public IList<string> ComplexType
+ {
+ get { return complexType; }
+ set { complexType = value; }
+ }
+
+ private IEnumerable<string> bag;
+ public IEnumerable<string> Bag
+ {
+ get { return bag; }
+ set { bag = value; }
+ }
+
+ private IEnumerable<MyCompo> idBag;
+ public IEnumerable<MyCompo> IdBag
+ {
+ get { return idBag; }
+ set { idBag = value; }
+ }
+
+ private IEnumerable<string> set;
+ public IEnumerable<string> Set
+ {
+ get { return set; }
+ set { set = value; }
+ }
+
+ private IEnumerable<string> list;
+ public IEnumerable<string> List
+ {
+ get { return list; }
+ set { list = value; }
+ }
+
+ private IDictionary<int, string> map;
+ public IDictionary<int, string> Map
+ {
+ get { return map; }
+ set { map = value; }
+ }
+
+ private MyCompo compo;
+ public MyCompo Compo
+ {
+ get { return compo; }
+ set { compo = value; }
+ }
+
+ private Related oneToOne;
+ public Related OneToOne
+ {
+ get { return oneToOne; }
+ set { oneToOne = value; }
+ }
+
+ private Related manyToOne;
+ public Related ManyToOne
+ {
+ get { return manyToOne; }
+ set { manyToOne = value; }
+ }
+
+ private object any;
+ public object Any
+ {
+ get { return any; }
+ set { any = value; }
+ }
+
+ private IDictionary dynamicCompo;
+ public IDictionary DynamicCompo
+ {
+ get { return dynamicCompo; }
+ set { dynamicCompo = value; }
+ }
+ }
+
+ private class MyCompo
+ {
+ public int Something { get; set; }
+ }
+ private class Related
+ {
+ public int Id { get; set; }
+ }
+
+ private class Inherited:MyClass
+ {
+
+ }
+
+ [Test]
+ public void WhenMapPropertiesInTheInheritedThenMapInBase()
+ {
+ // without ignoring MyClass as root-class I will try to map all properties using the inherited class.
+ // NH have to recognize the case and, following Object-Relational-Mapping rules, map those properties in the base class.
+ // Where needed, using the SimpleModelInspector, the user can revert this behavior checking the DeclaringType and ReflectedType of the persistent member.
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(mc => mc.Id(x => x.Id));
+ mapper.JoinedSubclass<Inherited>(mc =>
+ {
+ mc.Property(x => x.Simple, map => map.Access(Accessor.Field));
+ mc.Property(x => x.ComplexType, map => map.Access(Accessor.Field));
+ mc.Bag(x => x.Bag, y => y.Access(Accessor.Field));
+ mc.IdBag(x => x.IdBag, y => y.Access(Accessor.Field));
+ mc.List(x => x.List, y => y.Access(Accessor.Field));
+ mc.Set(x => x.Set, y => y.Access(Accessor.Field));
+ mc.Map(x => x.Map, y => y.Access(Accessor.Field));
+ mc.OneToOne(x => x.OneToOne, y => y.Access(Accessor.Field));
+ mc.ManyToOne(x => x.ManyToOne, y => y.Access(Accessor.Field));
+ mc.Any(x => x.Any, typeof(int), y => y.Access(Accessor.Field));
+ mc.Component(x => x.DynamicCompo, new { A=2 }, y => y.Access(Accessor.Field));
+ mc.Component(x => x.Compo, y =>
+ {
+ y.Access(Accessor.Field);
+ y.Property(c => c.Something);
+ });
+ });
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ var hbmClass = mappings.RootClasses[0];
+ var hbmJoinedSubclass = mappings.JoinedSubclasses[0];
+ hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo");
+ hbmClass.Properties.Select(p => p.Access).All(x=> x.Satisfy(access=> access.Contains("field.")));
+ hbmJoinedSubclass.Properties.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenMapPropertiesInTheBaseJumpedClassThenMapInInherited()
+ {
+ // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class.
+ // NH have to recognize the case and map those properties in the inherited.
+ var inspector = new SimpleModelInspector();
+ inspector.IsRootEntity((type, declared) => type == typeof(Inherited));
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Property(x => x.Simple, map => map.Access(Accessor.Field));
+ mc.Property(x => x.ComplexType, map => map.Access(Accessor.Field));
+ mc.Bag(x => x.Bag, y => y.Access(Accessor.Field));
+ mc.IdBag(x => x.IdBag, y => y.Access(Accessor.Field));
+ mc.List(x => x.List, y => y.Access(Accessor.Field));
+ mc.Set(x => x.Set, y => y.Access(Accessor.Field));
+ mc.Map(x => x.Map, y => y.Access(Accessor.Field));
+ mc.OneToOne(x => x.OneToOne, y => y.Access(Accessor.Field));
+ mc.ManyToOne(x => x.ManyToOne, y => y.Access(Accessor.Field));
+ mc.Any(x => x.Any, typeof(int), y => y.Access(Accessor.Field));
+ mc.Component(x => x.DynamicCompo, new { A = 2 }, y => y.Access(Accessor.Field));
+ mc.Component(x => x.Compo, y =>
+ {
+ y.Access(Accessor.Field);
+ y.Property(c => c.Something);
+ });
+ });
+ mapper.Class<Inherited>(mc =>{});
+
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ var hbmClass = mappings.RootClasses[0];
+ mappings.JoinedSubclasses.Should().Be.Empty();
+ hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo");
+ hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field.")));
+ }
+
+ [Test]
+ public void WhenMapPropertiesInTheInheritedUsingMemberNameThenMapInBase()
+ {
+ // without ignoring MyClass as root-class I will try to map all properties using the inherited class.
+ // NH have to recognize the case and, following Object-Relational-Mapping rules, map those properties in the base class.
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(mc => mc.Id(x => x.Id));
+ mapper.JoinedSubclass<Inherited>(mc =>
+ {
+ mc.Property("Simple", map => map.Access(Accessor.Field));
+ mc.Property("ComplexType", map => map.Access(Accessor.Field));
+ mc.Bag<string>("Bag", y => y.Access(Accessor.Field));
+ mc.IdBag<MyCompo>("IdBag", y => y.Access(Accessor.Field));
+ mc.List<string>("List", y => y.Access(Accessor.Field));
+ mc.Set<string>("Set", y => y.Access(Accessor.Field));
+ mc.Map<int, string>("Map", y => y.Access(Accessor.Field));
+ mc.OneToOne<Related>("OneToOne", y => y.Access(Accessor.Field));
+ mc.ManyToOne<Related>("ManyToOne", y => y.Access(Accessor.Field));
+ mc.Any<object>("Any", typeof(int), y => y.Access(Accessor.Field));
+ mc.Component("DynamicCompo", new { A = 2 }, y => y.Access(Accessor.Field));
+ mc.Component<MyCompo>("Compo", y =>
+ {
+ y.Access(Accessor.Field);
+ y.Property(c => c.Something);
+ });
+ });
+ var mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ var hbmClass = mappings.RootClasses[0];
+ var hbmJoinedSubclass = mappings.JoinedSubclasses[0];
+ hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any", "DynamicCompo");
+ hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field.")));
+ hbmJoinedSubclass.Properties.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenMapPropertiesInTheBaseJumpedClassUsingMemberNameThenMapInInherited()
+ {
+ // ignoring MyClass and using Inherited, as root-class, I will try to map all properties using the base class.
+ // NH have to recognize the case and map those properties in the inherited.
+ var inspector = new SimpleModelInspector();
+ inspector.IsRootEntity((type, declared) => type == typeof (Inherited));
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(mc =>
+ {
+ mc.Id(x => x.Id);
+ mc.Property("Simple", map => map.Access(Accessor.Field));
+ mc.Property("ComplexType", map => map.Access(Accessor.Field));
+ mc.Bag<string>("Bag", y => y.Access(Accessor.Field));
+ mc.IdBag<MyCompo>("IdBag", y => y.Access(Accessor.Field));
+ mc.List<string>("List", y => y.Access(Accessor.Field));
+ mc.Set<string>("Set", y => y.Access(Accessor.Field));
+ mc.Map<int, string>("Map", y => y.Access(Accessor.Field));
+ mc.OneToOne<Related>("OneToOne", y => y.Access(Accessor.Field));
+ mc.ManyToOne<Related>("ManyToOne", y => y.Access(Accessor.Field));
+ mc.Any<object>("Any", typeof (int), y => y.Access(Accessor.Field));
+ mc.Component("DynamicCompo", new {A = 2}, y => y.Access(Accessor.Field));
+ mc.Component<MyCompo>("Compo", y =>
+ {
+ y.Access(Accessor.Field);
+ y.Property(c => c.Something);
+ });
+ });
+ mapper.Class<Inherited>(mc => { });
+
+ HbmMapping mappings = mapper.CompileMappingForAllExplicitAddedEntities();
+ HbmClass hbmClass = mappings.RootClasses[0];
+ mappings.JoinedSubclasses.Should().Be.Empty();
+ hbmClass.Properties.Select(p => p.Name).Should().Have.SameValuesAs("Simple", "ComplexType", "Bag", "IdBag", "List", "Set", "Map", "Compo", "OneToOne", "ManyToOne", "Any",
+ "DynamicCompo");
+ hbmClass.Properties.Select(p => p.Access).All(x => x.Satisfy(access => access.Contains("field.")));
+ }
+ }
+}
\ 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-29 18:28:17 UTC (rev 5789)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-29 21:16:22 UTC (rev 5790)
@@ -517,6 +517,7 @@
<Compile Include="MappingByCode\ConventionModelMapperTests\PropertyToFieldAccessorTest.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\SafePoidTests.cs" />
<Compile Include="MappingByCode\ConventionModelMapperTests\VersionOnBaseClassIntegrationTest.cs" />
+ <Compile Include="MappingByCode\ExpliticMappingTests\AllPropertiesRegistrationTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\BagOfNestedComponentsWithParentTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ClassWithComponentsTest.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ComponentAsIdTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-29 18:28:23
|
Revision: 5789
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5789&view=rev
Author: fabiomaulo
Date: 2011-04-29 18:28:17 +0000 (Fri, 29 Apr 2011)
Log Message:
-----------
by-code : Breaking change with Alpha2 to map private/protected members
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -28,7 +28,7 @@
{
void Property<TProperty>(Expression<Func<TContainer, TProperty>> property);
void Property<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IPropertyMapper> mapping);
- void Property(FieldInfo member, Action<IPropertyMapper> mapping);
+ void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping);
void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class;
void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class;
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -117,10 +117,12 @@
base.RegisterPropertyMapping(property, mapping);
}
- protected override void RegisterFieldMapping(FieldInfo member, Action<IPropertyMapper> mapping)
+ protected override void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, System.Action<IPropertyMapper> mapping)
{
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+
ExplicitDeclarationsHolder.AddAsPropertySplit(new SplitDefinition(typeof(TEntity), splitGroupId, member));
- base.RegisterFieldMapping(member, mapping);
+ base.RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping);
}
protected override void RegisterComponentMapping<TComponent>(Expression<Func<TEntity, TComponent>> property, Action<IComponentMapper<TComponent>> mapping)
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/NaturalIdCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -16,10 +16,14 @@
base.RegisterPropertyMapping(property, mapping);
}
- protected override void RegisterFieldMapping(FieldInfo member, System.Action<IPropertyMapper> mapping)
+ protected override void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, System.Action<IPropertyMapper> mapping)
{
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
+
ExplicitDeclarationsHolder.AddAsNaturalId(member);
- base.RegisterFieldMapping(member, mapping);
+ ExplicitDeclarationsHolder.AddAsNaturalId(memberOf);
+ base.RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping);
}
protected override void RegisterComponentMapping<TComponent>(System.Linq.Expressions.Expression<System.Func<TEntity, TComponent>> property, System.Action<IComponentMapper<TComponent>> mapping)
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -49,15 +49,21 @@
explicitDeclarationsHolder.AddAsProperty(memberOf);
}
- public void Property(FieldInfo member, Action<IPropertyMapper> mapping)
+ public void Property(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping)
{
- RegisterFieldMapping(member, mapping);
+ RegisterNoVisiblePropertyMapping(notVidiblePropertyOrFieldName, mapping);
}
- protected virtual void RegisterFieldMapping(FieldInfo member, Action<IPropertyMapper> mapping)
+ protected virtual void RegisterNoVisiblePropertyMapping(string notVidiblePropertyOrFieldName, Action<IPropertyMapper> mapping)
{
+ // even seems repetitive, before unify this registration with the registration using Expression take in account that reflection operations
+ // done unsing expressions are faster than those done with pure reflection.
+ MemberInfo member = typeof(TEntity).GetPropertyOrFieldMatchingName(notVidiblePropertyOrFieldName);
+ MemberInfo memberOf = member.GetMemberFromReflectedType(typeof(TEntity));
CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, member), mapping);
+ CustomizersHolder.AddCustomizer(new PropertyPath(PropertyPath, memberOf), mapping);
explicitDeclarationsHolder.AddAsProperty(member);
+ explicitDeclarationsHolder.AddAsProperty(memberOf);
}
public void Component<TComponent>(Expression<Func<TEntity, TComponent>> property,
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ConventionModelMapperTests/PropertyToFieldAccessorTest.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -50,9 +50,8 @@
[Test]
public void WhenFieldAccessToField()
{
- var member = typeof(MyClass).GetField("aField",BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
var mapper = new ConventionModelMapper();
- mapper.Class<MyClass>(mc => mc.Property(member, x => { }));
+ mapper.Class<MyClass>(mc => mc.Property("aField", x => { }));
var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
var hbmClass = hbmMapping.RootClasses[0];
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/MappingOfPrivateMembersOnRootEntity.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -25,7 +25,7 @@
map.Column("MyClassId");
map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 }));
});
- ca.Property(ForClass<MyClass>.Field("something"), map => map.Length(150));
+ ca.Property("something", map => map.Length(150));
});
var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
var hbmClass = hbmMapping.RootClasses[0];
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs 2011-04-29 16:51:56 UTC (rev 5788)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PropertiesExclusionTests.cs 2011-04-29 18:28:17 UTC (rev 5789)
@@ -84,7 +84,7 @@
{
var autoinspector = new SimpleModelInspector();
var mapper = new ModelMapper(autoinspector);
- mapper.Class<MyEntity>(map => map.Property(ForClass<MyEntity>.Field("pizza"), x => { }));
+ mapper.Class<MyEntity>(map => map.Property("pizza", x => { }));
var inspector = (IModelInspector)autoinspector;
var pi = typeof(MyEntity).GetField("pizza", BindingFlags.Instance | BindingFlags.NonPublic);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-29 16:52:02
|
Revision: 5788
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5788&view=rev
Author: fabiomaulo
Date: 2011-04-29 16:51:56 +0000 (Fri, 29 Apr 2011)
Log Message:
-----------
SimpleModelInspector managing polymorphic registration
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-28 22:49:42 UTC (rev 5787)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-29 16:51:56 UTC (rev 5788)
@@ -530,108 +530,108 @@
bool IModelInspector.IsOneToOne(MemberInfo member)
{
- bool declaredResult = declaredModel.IsOneToOne(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsOneToOne(m));
return isOneToOne(member, declaredResult);
}
bool IModelInspector.IsManyToOne(MemberInfo member)
{
- bool declaredResult = declaredModel.IsManyToOne(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsManyToOne(m));
return isManyToOne(member, declaredResult);
}
bool IModelInspector.IsManyToMany(MemberInfo member)
{
- bool declaredResult = declaredModel.IsManyToMany(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsManyToMany(m));
return isManyToMany(member, declaredResult);
}
bool IModelInspector.IsOneToMany(MemberInfo member)
{
- bool declaredResult = declaredModel.IsOneToMany(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsOneToMany(m));
return isOneToMany(member, declaredResult);
}
bool IModelInspector.IsAny(MemberInfo member)
{
- bool declaredResult = declaredModel.IsAny(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsAny(m));
return isAny(member, declaredResult);
}
bool IModelInspector.IsPersistentId(MemberInfo member)
{
- bool declaredResult = declaredModel.IsPersistentId(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsPersistentId(m));
return isPersistentId(member, declaredResult);
}
bool IModelInspector.IsMemberOfComposedId(MemberInfo member)
{
- return declaredModel.IsPersistentId(member);
+ return declaredModel.IsMemberOfComposedId(member);
}
bool IModelInspector.IsVersion(MemberInfo member)
{
- bool declaredResult = declaredModel.IsVersion(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsVersion(m));
return isVersion(member, declaredResult);
}
bool IModelInspector.IsMemberOfNaturalId(MemberInfo member)
{
- bool declaredResult = declaredModel.IsMemberOfNaturalId(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsMemberOfNaturalId(m));
return isMemberOfNaturalId(member, declaredResult);
}
bool IModelInspector.IsPersistentProperty(MemberInfo member)
{
- bool declaredResult = declaredModel.IsPersistentProperty(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsPersistentProperty(m));
return isPersistentProperty(member, declaredResult);
}
bool IModelInspector.IsSet(MemberInfo role)
{
- bool declaredResult = declaredModel.IsSet(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsSet(m));
return isSet(role, declaredResult);
}
bool IModelInspector.IsBag(MemberInfo role)
{
- bool declaredResult = declaredModel.IsBag(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsBag(m));
return isBag(role, declaredResult);
}
bool IModelInspector.IsIdBag(MemberInfo role)
{
- bool declaredResult = declaredModel.IsIdBag(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsIdBag(m));
return isIdBag(role, declaredResult);
}
bool IModelInspector.IsList(MemberInfo role)
{
- bool declaredResult = declaredModel.IsList(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsList(m));
return isList(role, declaredResult);
}
bool IModelInspector.IsArray(MemberInfo role)
{
- bool declaredResult = declaredModel.IsArray(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsArray(m));
return isArray(role, declaredResult);
}
bool IModelInspector.IsDictionary(MemberInfo role)
{
- bool declaredResult = declaredModel.IsDictionary(role);
+ bool declaredResult = DeclaredPolymorphicMatch(role, m => declaredModel.IsDictionary(m));
return isDictionary(role, declaredResult);
}
bool IModelInspector.IsProperty(MemberInfo member)
{
- bool declaredResult = declaredModel.IsProperty(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsProperty(m));
return isProperty(member, declaredResult);
}
bool IModelInspector.IsDynamicComponent(MemberInfo member)
{
- bool declaredResult = declaredModel.IsDynamicComponent(member);
+ bool declaredResult = DeclaredPolymorphicMatch(member, m => declaredModel.IsDynamicComponent(m));
return isDynamicComponent(member, declaredResult);
}
@@ -652,6 +652,13 @@
#endregion
+ protected virtual bool DeclaredPolymorphicMatch(MemberInfo member, Func<MemberInfo, bool> declaredMatch)
+ {
+ return declaredMatch(member)
+ || member.GetMemberFromDeclaringClasses().Any(declaredMatch)
+ || member.GetPropertyFromInterfaces().Any(declaredMatch);
+ }
+
public void IsRootEntity(Func<System.Type, bool, bool> match)
{
if (match == null)
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 22:49:42 UTC (rev 5787)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-29 16:51:56 UTC (rev 5788)
@@ -170,9 +170,36 @@
{
return source;
}
- return source.DeclaringType.GetProperty(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
+ if (source is PropertyInfo)
+ {
+ return source.DeclaringType.GetProperty(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
+ }
+ if (source is FieldInfo)
+ {
+ return source.DeclaringType.GetField(source.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
+ }
+ return null;
}
+ public static IEnumerable<MemberInfo> GetMemberFromDeclaringClasses(this MemberInfo source)
+ {
+ if (source == null)
+ {
+ throw new ArgumentNullException("source");
+ }
+ if (source is PropertyInfo)
+ {
+ var reflectedType = source.ReflectedType;
+ var memberType = source.GetPropertyOrFieldType();
+ return reflectedType.GetPropertiesOfHierarchy().Cast<PropertyInfo>().Where(x => source.Name.Equals(x.Name) && memberType.Equals(x.PropertyType)).Cast<MemberInfo>();
+ }
+ if (source is FieldInfo)
+ {
+ return new[] { source.GetMemberFromDeclaringType() };
+ }
+ return Enumerable.Empty<MemberInfo>();
+ }
+
public static IEnumerable<MemberInfo> GetPropertyFromInterfaces(this MemberInfo source)
{
if (source == null)
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MixAutomapping/PolymorphicPropertiesMapping.cs 2011-04-29 16:51:56 UTC (rev 5788)
@@ -0,0 +1,99 @@
+using System;
+using System.Reflection;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.MixAutomapping
+{
+ public class PolymorphicPropertiesMapping
+ {
+ const BindingFlags RootClassPropertiesBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy;
+
+ private interface IBaseEntity
+ {
+ int Id { get; }
+ }
+
+ private class BaseEntity : IBaseEntity
+ {
+ public int Id { get; protected set; }
+ public DateTime LastChange { get { return DateTime.Now; } }
+ }
+
+ private interface IProduct : IBaseEntity
+ {
+ string Description { get;}
+ }
+
+ private abstract class BaseProduct : BaseEntity, IProduct
+ {
+ public abstract string Description { get; }
+ }
+
+ private class Product : BaseProduct
+ {
+ public override string Description
+ {
+ get { return "blah"; }
+ }
+ }
+
+ [Test]
+ public void WhenMapIdThroughBaseInterfaceThenFindIt()
+ {
+ var inspector = (IModelInspector)new SimpleModelInspector();
+ var mapper = new ModelMapper(inspector);
+ mapper.Class<IBaseEntity>(
+ map =>
+ {
+ map.Id(x => x.Id, idmap => { });
+ });
+ inspector.IsPersistentId(typeof(Product).GetProperty("Id", RootClassPropertiesBindingFlags)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenMapPropertyThroughBaseConcreteClassThenFindIt()
+ {
+ var inspector = (IModelInspector)new SimpleModelInspector();
+ var mapper = new ModelMapper(inspector);
+
+ mapper.Class<BaseEntity>(map => map.Property(x => x.LastChange));
+
+ inspector.IsPersistentProperty(typeof(Product).GetProperty("LastChange", RootClassPropertiesBindingFlags)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenMapPropertyThroughBaseInterfaceThenFindIt()
+ {
+ var inspector = (IModelInspector)new SimpleModelInspector();
+ var mapper = new ModelMapper(inspector);
+
+ mapper.Class<IProduct>(map => map.Property(x => x.Description));
+
+ inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenMapPropertyThroughBaseAbstractClassThenFindIt()
+ {
+ var inspector = (IModelInspector)new SimpleModelInspector();
+ var mapper = new ModelMapper(inspector);
+
+ mapper.Class<BaseProduct>(map => map.Property(x => x.Description));
+
+ inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenMapPropertyThroughClassThenFindIt()
+ {
+ var inspector = (IModelInspector)new SimpleModelInspector();
+ var mapper = new ModelMapper(inspector);
+
+ mapper.Class<Product>(map => map.Property(x => x.Description));
+
+ inspector.IsPersistentProperty(typeof(Product).GetProperty("Description", RootClassPropertiesBindingFlags)).Should().Be.True();
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs 2011-04-28 22:49:42 UTC (rev 5787)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs 2011-04-29 16:51:56 UTC (rev 5788)
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.Linq;
using System.Reflection;
using NHibernate.Mapping.ByCode;
using NUnit.Framework;
@@ -203,5 +204,41 @@
typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => false).Should().Be.False();
typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => true).Should().Be.True();
}
+
+ private abstract class MyAbstract
+ {
+ protected int aField;
+ public abstract string Description { get; }
+ }
+
+ private class MyConcrete : MyAbstract
+ {
+ public override string Description
+ {
+ get { return "blah"; }
+ }
+ }
+
+ [Test]
+ public void GetMemberFromDeclaringClasses_WhenPropertyThenFindAbstract()
+ {
+ var member = typeof(MyConcrete).GetProperty("Description", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
+ var found = member.GetMemberFromDeclaringClasses().ToList();
+ found.Count.Should().Be(2);
+ var concreteMember = For<MyConcrete>.Property(x => x.Description).GetMemberFromReflectedType(typeof(MyConcrete));
+ var abstractMember = For<MyAbstract>.Property(x => x.Description);
+ found.Should().Have.SameValuesAs(concreteMember, abstractMember);
+ }
+
+ [Test]
+ public void GetMemberFromDeclaringClasses_WhenFieldThenFindAbstract()
+ {
+ var member = typeof(MyConcrete).GetField("aField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
+ var found = member.GetMemberFromDeclaringClasses().ToList();
+ found.Count.Should().Be(1);
+ var foundMember = found.Single();
+ foundMember.DeclaringType.Should().Be(typeof(MyAbstract));
+ foundMember.ReflectedType.Should().Be(typeof(MyAbstract));
+ }
}
}
\ 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-28 22:49:42 UTC (rev 5787)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-29 16:51:56 UTC (rev 5788)
@@ -592,6 +592,7 @@
<Compile Include="MappingByCode\MixAutomapping\ManyToOneTest.cs" />
<Compile Include="MappingByCode\MixAutomapping\OneToManyTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\PoidTests.cs" />
+ <Compile Include="MappingByCode\MixAutomapping\PolymorphicPropertiesMapping.cs" />
<Compile Include="MappingByCode\MixAutomapping\PropertiesExclusionTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\RootEntityTests.cs" />
<Compile Include="MappingByCode\MixAutomapping\SetCollectionTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-28 22:49:48
|
Revision: 5787
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5787&view=rev
Author: fabiomaulo
Date: 2011-04-28 22:49:42 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
GetMemberFromReflectedType implemented
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 18:47:30 UTC (rev 5786)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 22:49:42 UTC (rev 5787)
@@ -420,6 +420,61 @@
}
/// <summary>
+ /// Given a property or a field try to get the member from a given possible inherited type.
+ /// </summary>
+ /// <param name="member">The member to find.</param>
+ /// <param name="reflectedType">The type where find the member.</param>
+ /// <returns>The member from the reflected-type or the original <paramref name="member"/> where the <paramref name="member"/> is not accessible from <paramref name="reflectedType"/>.</returns>
+ public static MemberInfo GetMemberFromReflectedType(this MemberInfo member, System.Type reflectedType)
+ {
+ if (member == null)
+ {
+ throw new ArgumentNullException("member");
+ }
+ if (reflectedType == null)
+ {
+ throw new ArgumentNullException("reflectedType");
+ }
+ var field = member as FieldInfo;
+ if (field != null && field.IsPrivate)
+ {
+ return member;
+ }
+ var property = member as PropertyInfo;
+ if (property != null)
+ {
+ var propertyGetter = property.GetGetMethod(true);
+ if (propertyGetter.IsPrivate)
+ {
+ return member;
+ }
+ if (property.DeclaringType.IsInterface)
+ {
+ System.Type[] interfaces = reflectedType.GetInterfaces();
+ var @interface = property.DeclaringType;
+ if (!interfaces.Contains(@interface))
+ {
+ return member;
+ }
+ var reflectedCandidateProps = reflectedType.GetProperties(PropertiesOfClassHierarchy);
+ InterfaceMapping memberMap = reflectedType.GetInterfaceMap(@interface);
+ for (int i = 0; i < memberMap.TargetMethods.Length; i++)
+ {
+ if (memberMap.InterfaceMethods[i] == propertyGetter)
+ {
+ return reflectedCandidateProps.Single(pi => pi.GetGetMethod(true) == memberMap.TargetMethods[i]);
+ }
+ }
+ return member;
+ }
+ }
+ var reflectedTypeProperties = reflectedType.GetProperties(PropertiesOfClassHierarchy);
+ var members = reflectedTypeProperties.Cast<MemberInfo>().Concat(reflectedType.GetFields(PropertiesOfClassHierarchy));
+ var result = members.FirstOrDefault(m=> m.Name.Equals(member.Name) && m.GetPropertyOrFieldType().Equals(member.GetPropertyOrFieldType()));
+ return result ?? member;
+ }
+
+ /// <summary>
/// Try to find a property or field from a given type.
/// </summary>
/// <param name="source">The type</param>
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromReflectedTest.cs 2011-04-28 22:49:42 UTC (rev 5787)
@@ -0,0 +1,133 @@
+using System;
+using System.Reflection;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class GetMemberFromReflectedTest
+ {
+ private const BindingFlags PrivateMembersFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
+
+ private class MyClass
+ {
+ private int pField;
+ private int PrivateProperty { get; set; }
+ public int AnotherProperty { get; set; }
+ protected int ProtectedProperty { get; set; }
+ private int Method() { return 0; }
+ }
+
+ private class Inherited : MyClass
+ {
+ private int pField;
+ private int PrivateProperty { get; set; }
+ }
+
+ private interface IInterface
+ {
+ int Something { get; set; }
+ int SomethingElse { get; set; }
+ }
+
+ private class MyClassWithExplicitImpl : IInterface
+ {
+ int IInterface.Something
+ {
+ get
+ {
+ throw new System.NotImplementedException();
+ }
+ set
+ {
+ throw new System.NotImplementedException();
+ }
+ }
+
+ public int SomethingElse
+ {
+ get { throw new NotImplementedException(); }
+ set { throw new NotImplementedException(); }
+ }
+ }
+
+ [Test]
+ public void WhenNullMemberThenThrows()
+ {
+ Executing.This(() => ((MemberInfo)null).GetMemberFromReflectedType(typeof(MyClass))).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenNullTypeThenThrows()
+ {
+ Executing.This(() => typeof(MyClassWithExplicitImpl).GetProperty("SomethingElse").GetMemberFromReflectedType(null)).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenNotExistentThenOriginal()
+ {
+ var propertyInfo = typeof(MyClassWithExplicitImpl).GetProperty("SomethingElse");
+ propertyInfo.GetMemberFromReflectedType(typeof(object)).Should().Be(propertyInfo);
+ }
+
+ [Test]
+ public void WhenNotAccessibleFieldThenOriginal()
+ {
+ var memberInfo = typeof(MyClass).GetField("pField", PrivateMembersFlags);
+ memberInfo.GetMemberFromReflectedType(typeof(Inherited)).Should().Be(memberInfo);
+ }
+
+ [Test]
+ public void WhenNotAccessiblePropertyThenOriginal()
+ {
+ var memberInfo = typeof(MyClass).GetProperty("PrivateProperty", PrivateMembersFlags);
+ memberInfo.GetMemberFromReflectedType(typeof(Inherited)).Should().Be(memberInfo);
+ }
+
+ [Test]
+ public void WhenAccessiblePropertyThenReflected()
+ {
+ var memberInfo = typeof(MyClass).GetProperty("ProtectedProperty", PrivateMembersFlags);
+ var result = memberInfo.GetMemberFromReflectedType(typeof(Inherited));
+ result.ReflectedType.Should().Be(typeof(Inherited));
+ result.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenPrivateFieldOnInheritedThenFindItOnInherited()
+ {
+ var memberInfo = typeof(Inherited).GetField("pField", PrivateMembersFlags);
+ var result = memberInfo.GetMemberFromReflectedType(typeof(MyClass));
+ result.ReflectedType.Should().Be(typeof(Inherited));
+ result.DeclaringType.Should().Be(typeof(Inherited));
+ }
+
+ [Test]
+ public void WhenPublicPropertyOfBaseOnInheritedThenFindItOnInherited()
+ {
+ var memberInfo = typeof(MyClass).GetProperty("AnotherProperty");
+ var result = memberInfo.GetMemberFromReflectedType(typeof(Inherited));
+ result.ReflectedType.Should().Be(typeof(Inherited));
+ result.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenPropertyOfInterfaceThenFindItOnClass()
+ {
+ var memberInfo = typeof(IInterface).GetProperty("SomethingElse");
+ var result = memberInfo.GetMemberFromReflectedType(typeof(MyClassWithExplicitImpl));
+ result.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl));
+ result.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl));
+ }
+
+ [Test]
+ public void WhenPropertyOfExplicitInterfaceThenFindItOnClass()
+ {
+ var memberInfo = typeof(IInterface).GetProperty("Something");
+ var result = memberInfo.GetMemberFromReflectedType(typeof(MyClassWithExplicitImpl));
+ result.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl));
+ result.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl));
+ }
+ }
+}
\ 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-28 18:47:30 UTC (rev 5786)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-28 22:49:42 UTC (rev 5787)
@@ -612,6 +612,7 @@
<Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorConcreteClassesTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromInterfacesTest.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromReflectedTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\GetPropertyOrFieldMatchingNameTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\TypeExtensionsTest.cs" />
<Compile Include="MappingByCode\TypeNameUtilTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-28 18:47:39
|
Revision: 5786
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5786&view=rev
Author: fabiomaulo
Date: 2011-04-28 18:47:30 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
by-code: Preparing to add new API for private/protected properties/fields
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 12:43:58 UTC (rev 5785)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/TypeExtensions.cs 2011-04-28 18:47:30 UTC (rev 5786)
@@ -9,8 +9,9 @@
{
public static class TypeExtensions
{
- private const BindingFlags PublicPropertiesOfClassHierarchy =
+ private const BindingFlags PropertiesOfClassHierarchy =
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy;
+ private const BindingFlags PropertiesOrFieldOfClass = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
public static IEnumerable<System.Type> GetBaseTypes(this System.Type type)
{
@@ -410,12 +411,97 @@
public static bool HasPublicPropertyOf(this System.Type source, System.Type typeOfProperty)
{
- return GetFirstPropertyOfType(source, typeOfProperty, PublicPropertiesOfClassHierarchy) != null;
+ return GetFirstPropertyOfType(source, typeOfProperty, PropertiesOfClassHierarchy) != null;
}
public static bool HasPublicPropertyOf(this System.Type source, System.Type typeOfProperty, Func<PropertyInfo, bool> acceptPropertyClauses)
{
- return GetFirstPropertyOfType(source, typeOfProperty, PublicPropertiesOfClassHierarchy, acceptPropertyClauses) != null;
+ return GetFirstPropertyOfType(source, typeOfProperty, PropertiesOfClassHierarchy, acceptPropertyClauses) != null;
}
+
+ /// <summary>
+ /// Try to find a property or field from a given type.
+ /// </summary>
+ /// <param name="source">The type</param>
+ /// <param name="memberName">The property or field name.</param>
+ /// <returns>
+ /// A <see cref="PropertyInfo"/> or a <see cref="FieldInfo"/> where the member is found; null otherwise.
+ /// </returns>
+ /// <remarks>
+ /// Where found the member is returned always from the declaring type.
+ /// </remarks>
+ public static MemberInfo GetPropertyOrFieldMatchingName(this System.Type source, string memberName)
+ {
+ if (source == null)
+ {
+ throw new ArgumentNullException("source");
+ }
+ if (memberName == null)
+ {
+ return null;
+ }
+ var nameToFind = memberName.Trim();
+ var members = source.GetPropertiesOfHierarchy().Concat(source.GetFieldsOfHierarchy()).Concat(source.GetPropertiesOfInterfacesImplemented());
+ return members.FirstOrDefault(x => x.Name == nameToFind);
+ }
+
+ private static IEnumerable<MemberInfo> GetPropertiesOfInterfacesImplemented(this System.Type source)
+ {
+ if (source.IsInterface)
+ {
+ foreach (var interfaceProperty in source.GetInterfaceProperties())
+ {
+ yield return interfaceProperty;
+ }
+ yield break;
+ }
+ foreach (var @interface in source.GetInterfaces())
+ {
+ foreach (var interfaceProperty in @interface.GetInterfaceProperties())
+ {
+ yield return interfaceProperty;
+ }
+ }
+ }
+
+ private static IEnumerable<MemberInfo> GetPropertiesOfHierarchy(this System.Type type)
+ {
+ if(type.IsInterface)
+ {
+ yield break;
+ }
+ System.Type analizing = type;
+ while (analizing != null && analizing != typeof(object))
+ {
+ foreach (PropertyInfo propertyInfo in analizing.GetProperties(PropertiesOrFieldOfClass))
+ {
+ yield return propertyInfo;
+ }
+ analizing = analizing.BaseType;
+ }
+ }
+
+ private static IEnumerable<MemberInfo> GetFieldsOfHierarchy(this System.Type type)
+ {
+ if (type.IsInterface)
+ {
+ yield break;
+ }
+ System.Type analizing = type;
+ while (analizing != null && analizing != typeof(object))
+ {
+ foreach (FieldInfo fieldInfo in GetUserDeclaredFields(analizing))
+ {
+ yield return fieldInfo;
+ }
+ analizing = analizing.BaseType;
+ }
+ }
+
+ private static 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(PropertiesOrFieldOfClass).Where(x => !x.Name.StartsWith("<"));
+ }
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetPropertyOrFieldMatchingNameTest.cs 2011-04-28 18:47:30 UTC (rev 5786)
@@ -0,0 +1,178 @@
+using System;
+using System.Reflection;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class GetPropertyOrFieldMatchingNameTest
+ {
+ private class MyClass
+ {
+ private int pField;
+ private int PrivateProperty { get; set; }
+ private int AnotherPrivateProperty { get; set; }
+ protected int ProtectedProperty { get; set; }
+ private int Method() { return 0; }
+ }
+
+ private class Inherited: MyClass
+ {
+ private int pField;
+ private int PrivateProperty { get; set; }
+ }
+
+ private interface IInterface
+ {
+ int Something { get; set; }
+ int SomethingElse { get; set; }
+ }
+
+ private class MyClassWithExplicitImpl: IInterface
+ {
+ int IInterface.Something
+ {
+ get
+ {
+ throw new System.NotImplementedException();
+ }
+ set
+ {
+ throw new System.NotImplementedException();
+ }
+ }
+
+ public int SomethingElse
+ {
+ get { throw new NotImplementedException(); }
+ set { throw new NotImplementedException(); }
+ }
+ }
+
+ [Test]
+ public void WhenNullTypeThenThrows()
+ {
+ Executing.This(() => ((System.Type)null).GetPropertyOrFieldMatchingName("A")).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenAskNullThenNull()
+ {
+ typeof(MyClass).GetPropertyOrFieldMatchingName(null).Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenAskNotExistentThenNull()
+ {
+ typeof(MyClass).GetPropertyOrFieldMatchingName("NotExistent").Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenAskPrivateFieldThenFindIt()
+ {
+ var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("pField");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("pField");
+ memberInfo.Should().Be.InstanceOf<FieldInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenAskPrivateFieldWithBlanksThenFindIt()
+ {
+ var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName(" pField ");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("pField");
+ memberInfo.Should().Be.InstanceOf<FieldInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenAskPrivatePropertyThenFindIt()
+ {
+ var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("PrivateProperty");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("PrivateProperty");
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenAskProtectedPropertyThenFindIt()
+ {
+ var memberInfo = typeof(MyClass).GetPropertyOrFieldMatchingName("ProtectedProperty");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("ProtectedProperty");
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>().And.ValueOf.DeclaringType.Should().Be(typeof(MyClass));
+ }
+
+ [Test]
+ public void WhenAskMethodThenNull()
+ {
+ typeof(MyClass).GetPropertyOrFieldMatchingName("Method").Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenAskPrivateFieldOnInheritedThenFindItOnInherited()
+ {
+ var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("pField");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("pField");
+ memberInfo.DeclaringType.Should().Be(typeof(Inherited));
+ memberInfo.ReflectedType.Should().Be(typeof(Inherited));
+ memberInfo.Should().Be.InstanceOf<FieldInfo>();
+ }
+
+ [Test]
+ public void WhenAskPrivatePropertyOnInheritedThenFindItOnInherited()
+ {
+ var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("PrivateProperty");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("PrivateProperty");
+ memberInfo.DeclaringType.Should().Be(typeof(Inherited));
+ memberInfo.ReflectedType.Should().Be(typeof(Inherited));
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>();
+ }
+
+ [Test]
+ public void WhenAskPrivatePropertyOfBaseOnInheritedThenFindItOnBase()
+ {
+ var memberInfo = typeof(Inherited).GetPropertyOrFieldMatchingName("AnotherPrivateProperty");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("AnotherPrivateProperty");
+ memberInfo.DeclaringType.Should().Be(typeof(MyClass));
+ memberInfo.ReflectedType.Should().Be(typeof(MyClass));
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>();
+ }
+
+ [Test]
+ public void WhenAskPropertyOfInterfaceThenFindIt()
+ {
+ var memberInfo = typeof(IInterface).GetPropertyOrFieldMatchingName("Something");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("Something");
+ memberInfo.DeclaringType.Should().Be(typeof(IInterface));
+ memberInfo.ReflectedType.Should().Be(typeof(IInterface));
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>();
+ }
+
+ [Test]
+ public void WhenAskPropertyOfExplicitInterfaceThenFindItOnInterface()
+ {
+ var memberInfo = typeof(MyClassWithExplicitImpl).GetPropertyOrFieldMatchingName("Something");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("Something");
+ memberInfo.DeclaringType.Should().Be(typeof(IInterface));
+ memberInfo.ReflectedType.Should().Be(typeof(IInterface));
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>();
+ }
+
+ [Test]
+ public void WhenAskPropertyOfImplementedInterfaceThenFindItOnType()
+ {
+ var memberInfo = typeof(MyClassWithExplicitImpl).GetPropertyOrFieldMatchingName("SomethingElse");
+ memberInfo.Should().Not.Be.Null();
+ memberInfo.Name.Should().Be("SomethingElse");
+ memberInfo.DeclaringType.Should().Be(typeof(MyClassWithExplicitImpl));
+ memberInfo.ReflectedType.Should().Be(typeof(MyClassWithExplicitImpl));
+ memberInfo.Should().Be.InstanceOf<PropertyInfo>();
+ }
+ }
+}
\ 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-28 12:43:58 UTC (rev 5785)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-28 18:47:30 UTC (rev 5786)
@@ -612,6 +612,7 @@
<Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorConcreteClassesTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromInterfacesTest.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\GetPropertyOrFieldMatchingNameTest.cs" />
<Compile Include="MappingByCode\TypeExtensionsTests\TypeExtensionsTest.cs" />
<Compile Include="MappingByCode\TypeNameUtilTests.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-28 12:44:04
|
Revision: 5785
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5785&view=rev
Author: fabiomaulo
Date: 2011-04-28 12:43:58 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
Ported some tests
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/CompatibilityWithCandidatePersistentMembers.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorConcreteClassesTest.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorTest.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromInterfacesTest.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/CompatibilityWithCandidatePersistentMembers.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/CompatibilityWithCandidatePersistentMembers.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/CompatibilityWithCandidatePersistentMembers.cs 2011-04-28 12:43:58 UTC (rev 5785)
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using System.Linq;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Mapping.ByCode.Impl;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class CompatibilityWithCandidatePersistentMembers
+ {
+ public abstract class Geo
+ {
+ public string Descrition { get; set; }
+ protected Geo Parent { get; set; }
+ protected ICollection<Geo> Elements { get; set; }
+ }
+
+ [Test]
+ public void GetFirstPropertyOfTypeShouldUseSameConceptsOfCandidatePersistentMembersProvider()
+ {
+ var memberProvider = new DefaultCandidatePersistentMembersProvider();
+ var properties = memberProvider.GetRootEntityMembers(typeof(Geo));
+ if(properties.Select(p => p.Name).Contains("Parent"))
+ {
+ typeof(Geo).GetFirstPropertyOfType(typeof(Geo)).Should().Not.Be.Null();
+ }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorConcreteClassesTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorConcreteClassesTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorConcreteClassesTest.cs 2011-04-28 12:43:58 UTC (rev 5785)
@@ -0,0 +1,53 @@
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class GetFirstImplementorConcreteClassesTest
+ {
+ private class MyClass1
+ {
+
+ }
+ private class MyClass2 : MyClass1
+ {
+
+ }
+ private class MyClass3 : MyClass2
+ {
+
+ }
+ private class MyClass4 : MyClass3
+ {
+
+ }
+
+ [Test]
+ public void WhenImplIsAtSameLevelThenReturnImplementor()
+ {
+ typeof(MyClass1).GetFirstImplementorOf(typeof(MyClass1)).Should().Be(typeof(MyClass1));
+ typeof(MyClass2).GetFirstImplementorOf(typeof(MyClass2)).Should().Be(typeof(MyClass2));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(MyClass3)).Should().Be(typeof(MyClass3));
+ typeof(MyClass4).GetFirstImplementorOf(typeof(MyClass4)).Should().Be(typeof(MyClass4));
+ }
+
+ [Test]
+ public void WhenImplIsAtDifferentLevelThenReturnImplementor()
+ {
+ typeof(MyClass2).GetFirstImplementorOf(typeof(MyClass1)).Should().Be(typeof(MyClass2));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(MyClass1)).Should().Be(typeof(MyClass2));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(MyClass2)).Should().Be(typeof(MyClass3));
+ typeof(MyClass4).GetFirstImplementorOf(typeof(MyClass1)).Should().Be(typeof(MyClass2));
+ typeof(MyClass4).GetFirstImplementorOf(typeof(MyClass2)).Should().Be(typeof(MyClass3));
+ typeof(MyClass4).GetFirstImplementorOf(typeof(MyClass3)).Should().Be(typeof(MyClass4));
+ }
+
+ [Test]
+ public void WhenImplIsAtUpLevelThenReturnNull()
+ {
+ typeof(MyClass2).GetFirstImplementorOf(typeof(MyClass3)).Should().Be.Null();
+ typeof(MyClass3).GetFirstImplementorOf(typeof(MyClass4)).Should().Be.Null();
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetFirstImplementorTest.cs 2011-04-28 12:43:58 UTC (rev 5785)
@@ -0,0 +1,78 @@
+using System;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class GetFirstImplementorTest
+ {
+ private interface IInterfaceNoImpl
+ {
+
+ }
+ private interface IInterface1
+ {
+
+ }
+ private interface IInterface2
+ {
+
+ }
+ private interface IInterface3
+ {
+
+ }
+ private class MyClassNoInterface
+ {
+
+ }
+ private class MyClass1: IInterface1
+ {
+
+ }
+ private class MyClass2: MyClass1, IInterface2
+ {
+
+ }
+ private class MyClass3 : MyClass2, IInterface3
+ {
+
+ }
+
+ [Test]
+ public void WhenInvalidThenThrows()
+ {
+ Executing.This(()=>((System.Type) null).GetFirstImplementorOf(typeof(IInterfaceNoImpl))).Should().Throw<ArgumentNullException>();
+ Executing.This(() => typeof(IInterfaceNoImpl).GetFirstImplementorOf(null)).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenIsInterfaceThenNoImplementor()
+ {
+ typeof(IInterfaceNoImpl).GetFirstImplementorOf(typeof(IInterfaceNoImpl)).Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenImplAsNoInterfaceThenNoImplementor()
+ {
+ typeof(MyClassNoInterface).GetFirstImplementorOf(typeof(IInterfaceNoImpl)).Should().Be.Null();
+ }
+
+ [Test]
+ public void WhenImplIsAtSameLevelThenReturnImplementor()
+ {
+ typeof(MyClass1).GetFirstImplementorOf(typeof(IInterface1)).Should().Be(typeof(MyClass1));
+ typeof(MyClass2).GetFirstImplementorOf(typeof(IInterface2)).Should().Be(typeof(MyClass2));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(IInterface3)).Should().Be(typeof(MyClass3));
+ }
+
+ [Test]
+ public void WhenImplIsAtDifferentLevelThenReturnImplementor()
+ {
+ typeof(MyClass2).GetFirstImplementorOf(typeof(IInterface1)).Should().Be(typeof(MyClass1));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(IInterface2)).Should().Be(typeof(MyClass2));
+ typeof(MyClass3).GetFirstImplementorOf(typeof(IInterface1)).Should().Be(typeof(MyClass1));
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromInterfacesTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromInterfacesTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/GetMemberFromInterfacesTest.cs 2011-04-28 12:43:58 UTC (rev 5785)
@@ -0,0 +1,82 @@
+using System;
+using System.Linq;
+using System.Reflection;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class GetMemberFromInterfacesTest
+ {
+ private class BaseEntity
+ {
+ public int Id { get; set; }
+ }
+
+ private interface IEntity
+ {
+ bool IsValid { get; }
+ string Something { get; set; }
+ }
+
+ private interface IHasSomething
+ {
+ string Something { get; set; }
+ }
+
+ private class Person : BaseEntity, IEntity, IHasSomething
+ {
+ private int someField;
+ public string Name { get; set; }
+ public bool IsValid { get { return false; } }
+ public string Something { get; set; }
+ }
+
+ private interface IInheritedHasSomething : IHasSomething
+ {
+ string Blah { get; set; }
+ }
+
+
+ [Test]
+ public void WhenNullArgumentThenThrows()
+ {
+ Executing.This(() => ((MemberInfo)null).GetPropertyFromInterfaces().ToList()).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void WhenNoInterfaceThenEmptyList()
+ {
+ For<BaseEntity>.Property(x=> x.Id).GetPropertyFromInterfaces().Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenFieldThenEmptyList()
+ {
+ ForClass<Person>.Field("someField").GetPropertyFromInterfaces().Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenOneInterfaceThenReturnMemberInfoOfInterface()
+ {
+ var members = For<Person>.Property(x => x.IsValid).GetPropertyFromInterfaces();
+ members.Single().Should().Be(For<IEntity>.Property(x=> x.IsValid));
+ }
+
+ [Test]
+ public void WhenTwoInterfacesThenReturnMemberInfoOfEachInterface()
+ {
+ var members = For<Person>.Property(x => x.Something).GetPropertyFromInterfaces();
+ members.Should().Contain(For<IEntity>.Property(x => x.Something));
+ members.Should().Contain(For<IHasSomething>.Property(x => x.Something));
+ }
+
+ [Test]
+ public void WhenPropertyOfInterfaceThenNotThrows()
+ {
+ var member = For<IInheritedHasSomething>.Property(x => x.Blah);
+ member.Executing(x=> x.GetPropertyFromInterfaces().Any()).NotThrows();
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeExtensionsTests/TypeExtensionsTest.cs 2011-04-28 12:43:58 UTC (rev 5785)
@@ -0,0 +1,207 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Reflection;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.TypeExtensionsTests
+{
+ public class TypeExtensionsTest
+ {
+ private const BindingFlags BindingFlagsIncludePrivate = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
+
+ [Test]
+ public void CanDetermineDictionaryKeyType()
+ {
+ typeof (IDictionary<string, int>).DetermineDictionaryKeyType().Should().Be.EqualTo<string>();
+ }
+
+ [Test]
+ public void WhenNoGenericDictionaryThenDetermineNullDictionaryKeyType()
+ {
+ typeof(IEnumerable<string>).DetermineDictionaryKeyType().Should().Be.Null();
+ }
+
+ [Test]
+ public void CanDetermineDictionaryValueType()
+ {
+ typeof(IDictionary<string, int>).DetermineDictionaryValueType().Should().Be.EqualTo<int>();
+ }
+
+ [Test]
+ public void WhenNoGenericDictionaryThenDetermineNullDictionaryValueType()
+ {
+ typeof(IEnumerable<string>).DetermineDictionaryValueType().Should().Be.Null();
+ }
+
+ private class MyBaseClass
+ {
+ public string BaseProperty { get; set; }
+ public bool BaseBool { get; set; }
+ private double SomethingPrivate { get; set; }
+ }
+ private class MyClass : MyBaseClass
+ {
+
+ }
+
+ [Test]
+ public void DecodeMemberAccessExpressionShouldReturnMemberOfDeclaringClass()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(mc => mc.BaseProperty).Satisfy(
+ mi => mi.ReflectedType == typeof(MyBaseClass) && mi.DeclaringType == typeof(MyBaseClass));
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass>(mc => mc.BaseBool).Satisfy(
+ mi => mi.ReflectedType == typeof(MyBaseClass) && mi.DeclaringType == typeof(MyBaseClass));
+ }
+
+ [Test]
+ public void GenericDecodeMemberAccessExpressionShouldReturnMemberOfDeclaringClass()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass, string>(mc => mc.BaseProperty).Satisfy(
+ mi => mi.ReflectedType == typeof(MyBaseClass) && mi.DeclaringType == typeof(MyBaseClass));
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpression<MyClass, bool>(mc => mc.BaseBool).Satisfy(
+ mi => mi.ReflectedType == typeof(MyBaseClass) && mi.DeclaringType == typeof(MyBaseClass));
+ }
+
+ [Test]
+ public void DecodeMemberAccessExpressionOfShouldReturnMemberOfRequiredClass()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyClass>(mc => mc.BaseProperty).Satisfy(
+ mi => mi.ReflectedType == typeof (MyClass) && mi.DeclaringType == typeof (MyBaseClass));
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyClass>(mc => mc.BaseBool).Satisfy(
+ mi => mi.ReflectedType == typeof(MyClass) && mi.DeclaringType == typeof(MyBaseClass));
+ }
+
+ [Test]
+ public void GenericDecodeMemberAccessExpressionOfShouldReturnMemberOfRequiredClass()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyClass, string>(mc => mc.BaseProperty).Satisfy(
+ mi => mi.ReflectedType == typeof(MyClass) && mi.DeclaringType == typeof(MyBaseClass));
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyClass, bool>(mc => mc.BaseBool).Satisfy(
+ mi => mi.ReflectedType == typeof(MyClass) && mi.DeclaringType == typeof(MyBaseClass));
+ }
+
+ [Test]
+ public void GetBaseTypesIncludesInterfaces()
+ {
+ typeof (Collection<>).GetBaseTypes().Should().Contain(typeof (IEnumerable));
+ }
+
+ private interface IEntity<T>
+ {
+ T Id { get; set; }
+ }
+ private abstract class AbstractEntity<T> : IEntity<T>
+ {
+ public abstract T Id { get; set; }
+ public abstract bool BaseBool { get; set; }
+ }
+
+ private class BaseEntity : AbstractEntity<int>
+ {
+ public override int Id { get; set; }
+
+ public override bool BaseBool { get; set; }
+ }
+ private class MyEntity: BaseEntity
+ {
+ }
+
+ [Test]
+ public void DecodeMemberAccessExpressionOfWithGenericShouldReturnMemberOfRequiredClass()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyEntity>(mc => mc.Id).Satisfy(
+ mi => mi.ReflectedType == typeof(MyEntity) && mi.DeclaringType == typeof(BaseEntity));
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<MyEntity>(mc => mc.BaseBool).Satisfy(
+ mi => mi.ReflectedType == typeof(MyEntity) && mi.DeclaringType == typeof(BaseEntity));
+ }
+
+ [Test]
+ public void WhenBaseIsAbstractGenericGetMemberFromDeclaringType()
+ {
+ var mi = typeof(MyEntity).GetProperty("Id", typeof(int));
+ var declaringMi = mi.GetMemberFromDeclaringType();
+ declaringMi.DeclaringType.Should().Be<BaseEntity>();
+ declaringMi.ReflectedType.Should().Be<BaseEntity>();
+ }
+
+ [Test]
+ public void WhenBaseIsAbstractGetMemberFromDeclaringType()
+ {
+ var mi = typeof(MyEntity).GetProperty("BaseBool", typeof(bool));
+ var declaringMi = mi.GetMemberFromDeclaringType();
+ declaringMi.DeclaringType.Should().Be<BaseEntity>();
+ declaringMi.ReflectedType.Should().Be<BaseEntity>();
+ }
+
+ [Test]
+ public void GetFirstPropertyOfTypeWithNulls()
+ {
+ System.Type myType = null;
+ myType.GetFirstPropertyOfType(typeof (int), BindingFlagsIncludePrivate).Should().Be.Null();
+ myType = typeof (Array);
+ myType.GetFirstPropertyOfType(null, BindingFlagsIncludePrivate).Should().Be.Null();
+ }
+
+ [Test]
+ public void GetFirstPropertyOfType_WhenPropertyExistThenFindProperty()
+ {
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (string)).Should().Be(
+ typeof (MyBaseClass).GetProperty("BaseProperty"));
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (bool)).Should().Be(typeof (MyBaseClass).GetProperty("BaseBool"));
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (double), BindingFlagsIncludePrivate).Should().Be(
+ typeof (MyBaseClass).GetProperty("SomethingPrivate", BindingFlagsIncludePrivate));
+ }
+
+ [Test]
+ public void GetFirstPropertyOfType_WhenPropertyNotExistThenNull()
+ {
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (float)).Should().Be.Null();
+ // typeof (MyBaseClass).GetFirstPropertyOfType(typeof (double)).Should().Be.Null(); <= by default check private prop.
+ }
+
+ private interface IMyEntity : IEntity<Guid>
+ {
+
+ }
+
+ [Test]
+ public void WhenDecodeMemberAccessExpressionOfOnInheritedEntityInterfaceThenDecodeMember()
+ {
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<IMyEntity>(m => m.Id).Should().Not.Be.Null();
+ Mapping.ByCode.TypeExtensions.DecodeMemberAccessExpressionOf<IMyEntity, Guid>(m => m.Id).Should().Not.Be.Null();
+ }
+
+ [Test]
+ public void TheSequenceOfGetHierarchyFromBaseShouldStartFromBaseClassUpToGivenClass()
+ {
+ // excluding System.Object
+ typeof(MyEntity).GetHierarchyFromBase().Should().Have.SameSequenceAs(typeof(AbstractEntity<int>), typeof(BaseEntity), typeof(MyEntity));
+ }
+
+ [Test]
+ public void GetFirstPropertyOfType_WhenDelegateIsNullThenThrow()
+ {
+ var myType = typeof(Array);
+ Executing.This(()=> myType.GetFirstPropertyOfType(typeof(int), BindingFlagsIncludePrivate, null)).Should().Throw<ArgumentNullException>();
+ }
+
+ [Test]
+ public void GetFirstPropertyOfType_WhenAsDelegateThenUseDelegateToFilterProperties()
+ {
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (string), BindingFlags.Public | BindingFlags.Instance, x => false).Should().Be.Null();
+ typeof (MyBaseClass).GetFirstPropertyOfType(typeof (string), BindingFlags.Public | BindingFlags.Instance, x => true).Should().Be(
+ typeof (MyBaseClass).GetProperty("BaseProperty"));
+ }
+
+ [Test]
+ public void HasPublicPropertyOf_WhenAsDelegateThenUseDelegateToFilterProperties()
+ {
+ typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => false).Should().Be.False();
+ typeof(MyBaseClass).HasPublicPropertyOf(typeof(string), x => true).Should().Be.True();
+ }
+ }
+}
\ 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-28 10:36:52 UTC (rev 5784)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-28 12:43:58 UTC (rev 5785)
@@ -608,6 +608,11 @@
<Compile Include="MappingByCode\NatureDemo\Naturalness\StateProvince.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\User.cs" />
<Compile Include="MappingByCode\NatureDemo\Naturalness\Zoo.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\CompatibilityWithCandidatePersistentMembers.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorConcreteClassesTest.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\GetFirstImplementorTest.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\GetMemberFromInterfacesTest.cs" />
+ <Compile Include="MappingByCode\TypeExtensionsTests\TypeExtensionsTest.cs" />
<Compile Include="MappingByCode\TypeNameUtilTests.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" />
<Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-28 10:36:58
|
Revision: 5784
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5784&view=rev
Author: fabiomaulo
Date: 2011-04-28 10:36:52 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
Fixed version number of the trunk
Modified Paths:
--------------
trunk/nhibernate/build-common/common.xml
Modified: trunk/nhibernate/build-common/common.xml
===================================================================
--- trunk/nhibernate/build-common/common.xml 2011-04-28 05:44:25 UTC (rev 5783)
+++ trunk/nhibernate/build-common/common.xml 2011-04-28 10:36:52 UTC (rev 5784)
@@ -84,7 +84,7 @@
effectively SP0).
-->
- <property name="project.version" value="3.2.0.Alpha2" overwrite="false" />
+ <property name="project.version" value="3.2.0.Alpha3" overwrite="false" />
<!-- Compute short project version (major.minor) using a regex -->
<regex input="${project.version}" pattern="^(?'shortversion'\d+\.\d+)" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pa...@us...> - 2011-04-28 05:44:31
|
Revision: 5783
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5783&view=rev
Author: patearl
Date: 2011-04-28 05:44:25 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
PostgreSQL: Fixed currency parameter type.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs
Modified: trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs 2011-04-28 04:20:33 UTC (rev 5782)
+++ trunk/nhibernate/src/NHibernate/Driver/NpgsqlDriver.cs 2011-04-28 05:44:25 UTC (rev 5783)
@@ -1,3 +1,5 @@
+using System.Data;
+
namespace NHibernate.Driver
{
/// <summary>
@@ -72,5 +74,13 @@
{
get { return true; }
}
+
+ protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlTypes.SqlType sqlType)
+ {
+ base.InitializeParameter(dbParam, name, sqlType);
+
+ if (sqlType.DbType == DbType.Currency)
+ dbParam.DbType = DbType.Decimal;
+ }
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pa...@us...> - 2011-04-28 04:20:39
|
Revision: 5782
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5782&view=rev
Author: patearl
Date: 2011-04-28 04:20:33 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
PostgreSQL: Support reserved word retrieval.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs
Modified: trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs 2011-04-28 03:33:35 UTC (rev 5781)
+++ trunk/nhibernate/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs 2011-04-28 04:20:33 UTC (rev 5782)
@@ -13,13 +13,6 @@
{
return new PostgreSQLTableMetadata(rs, this, extras);
}
-
- public override ISet<string> GetReservedWords()
- {
- // NpgsqlDriver does not currently (2011/03/30) support this feature, so the
- // base class implementation has to be overriden
- return new HashedSet<string>();
- }
}
public class PostgreSQLTableMetadata : AbstractTableMetadata
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pa...@us...> - 2011-04-28 03:33:41
|
Revision: 5781
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5781&view=rev
Author: patearl
Date: 2011-04-28 03:33:35 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
Tests: Latest Npgsql from trunk to fix test failures.
Modified Paths:
--------------
trunk/nhibernate/lib/teamcity/postgresql/Npgsql.dll
Modified: trunk/nhibernate/lib/teamcity/postgresql/Npgsql.dll
===================================================================
(Binary files differ)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-27 22:32:10
|
Revision: 5780
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5780&view=rev
Author: fabiomaulo
Date: 2011-04-27 22:32:04 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Passing test to check we are merging all
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 22:04:24 UTC (rev 5779)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 22:32:04 UTC (rev 5780)
@@ -182,8 +182,6 @@
public void AddAsTablePerClassHierarchyEntity(System.Type type) {}
- public void AddAsTablePerClassHierarchyJoinEntity(System.Type type) {}
-
public void AddAsTablePerConcreteClassEntity(System.Type type) {}
public void AddAsOneToOneRelation(MemberInfo member) {}
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 22:04:24 UTC (rev 5779)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 22:32:04 UTC (rev 5780)
@@ -1,3 +1,5 @@
+using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Impl;
@@ -8,6 +10,299 @@
{
public class ModelExplicitDeclarationsHolderMergeTest
{
+ private class ExplicitDeclarationsHolderMock: IModelExplicitDeclarationsHolder
+ {
+ public ExplicitDeclarationsHolderMock()
+ {
+ PropertiesGettersUsed = new HashSet<string>();
+ }
+ private readonly HashSet<MemberInfo> any = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> arrays = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> bags = new HashSet<MemberInfo>();
+ private readonly HashSet<System.Type> components = new HashSet<System.Type>();
+ private readonly HashSet<MemberInfo> dictionaries = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> idBags = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> lists = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> manyToManyRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> manyToOneRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> naturalIds = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> oneToManyRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> composedIds = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>();
+ private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>();
+ 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>();
+ private readonly HashSet<SplitDefinition> splitDefinitions = new HashSet<SplitDefinition>();
+ private readonly HashSet<System.Type> tablePerClassEntities = new HashSet<System.Type>();
+ private readonly HashSet<System.Type> tablePerClassHierarchyEntities = new HashSet<System.Type>();
+ private readonly HashSet<System.Type> tablePerConcreteClassEntities = new HashSet<System.Type>();
+ private readonly HashSet<MemberInfo> versionProperties = new HashSet<MemberInfo>();
+
+ public HashSet<string> PropertiesGettersUsed { get; set; }
+
+ #region IModelExplicitDeclarationsHolder Members
+
+ public IEnumerable<System.Type> RootEntities
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("RootEntities");
+ return rootEntities;
+ }
+ }
+
+ public IEnumerable<System.Type> Components
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Components");
+ return components;
+ }
+ }
+
+ public IEnumerable<System.Type> TablePerClassEntities
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("TablePerClassEntities");
+ return tablePerClassEntities;
+ }
+ }
+
+ public IEnumerable<System.Type> TablePerClassHierarchyEntities
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("TablePerClassHierarchyEntities");
+ return tablePerClassHierarchyEntities;
+ }
+ }
+
+ public IEnumerable<System.Type> TablePerConcreteClassEntities
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("TablePerConcreteClassEntities");
+ return tablePerConcreteClassEntities;
+ }
+ }
+
+ public IEnumerable<MemberInfo> OneToOneRelations
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("OneToOneRelations");
+ return oneToOneRelations;
+ }
+ }
+
+ public IEnumerable<MemberInfo> ManyToOneRelations
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("ManyToOneRelations");
+ return manyToOneRelations;
+ }
+ }
+
+ public IEnumerable<MemberInfo> ManyToManyRelations
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("ManyToManyRelations");
+ return manyToManyRelations;
+ }
+ }
+
+ public IEnumerable<MemberInfo> OneToManyRelations
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("OneToManyRelations");
+ return oneToManyRelations;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Any
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Any");
+ return any;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Poids
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Poids");
+ return poids;
+ }
+ }
+
+ public IEnumerable<MemberInfo> ComposedIds
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("ComposedIds");
+ return composedIds;
+ }
+ }
+
+ public IEnumerable<MemberInfo> VersionProperties
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("VersionProperties");
+ return versionProperties;
+ }
+ }
+
+ public IEnumerable<MemberInfo> NaturalIds
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("NaturalIds");
+ return naturalIds;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Sets
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Sets");
+ return sets;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Bags
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Bags");
+ return bags;
+ }
+ }
+
+ public IEnumerable<MemberInfo> IdBags
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("IdBags");
+ return idBags;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Lists
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Lists");
+ return lists;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Arrays
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Arrays");
+ return arrays;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Dictionaries
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Dictionaries");
+ return dictionaries;
+ }
+ }
+
+ public IEnumerable<MemberInfo> Properties
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("Properties");
+ return properties;
+ }
+ }
+
+ public IEnumerable<MemberInfo> DynamicComponents
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("DynamicComponents");
+ return dynamicComponents;
+ }
+ }
+
+ public IEnumerable<MemberInfo> PersistentMembers
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("PersistentMembers");
+ return persistentMembers;
+ }
+ }
+
+ public IEnumerable<SplitDefinition> SplitDefinitions
+ {
+ get
+ {
+ PropertiesGettersUsed.Add("SplitDefinitions");
+ return splitDefinitions;
+ }
+ }
+
+ public IEnumerable<string> GetSplitGroupsFor(System.Type type)
+ {
+ return Enumerable.Empty<string>();
+ }
+
+ public string GetSplitGroupFor(MemberInfo member)
+ {
+ return null;
+ }
+
+ public System.Type GetDynamicComponentTemplate(MemberInfo member)
+ {
+ return null;
+ }
+
+ public void AddAsRootEntity(System.Type type) { }
+ public void AddAsComponent(System.Type type) { }
+ public void AddAsTablePerClassEntity(System.Type type) { }
+ public void AddAsTablePerClassHierarchyEntity(System.Type type) { }
+ public void AddAsTablePerConcreteClassEntity(System.Type type) { }
+ public void AddAsOneToOneRelation(MemberInfo member) { }
+ public void AddAsManyToOneRelation(MemberInfo member) { }
+ public void AddAsManyToManyRelation(MemberInfo member) { }
+ public void AddAsOneToManyRelation(MemberInfo member) { }
+ public void AddAsAny(MemberInfo member) { }
+ public void AddAsPoid(MemberInfo member) { }
+ public void AddAsPartOfComposedId(MemberInfo member) { }
+ public void AddAsVersionProperty(MemberInfo member) { }
+ public void AddAsNaturalId(MemberInfo member) { }
+ public void AddAsSet(MemberInfo member) { }
+ public void AddAsBag(MemberInfo member) { }
+ public void AddAsIdBag(MemberInfo member) { }
+ public void AddAsList(MemberInfo member) { }
+ public void AddAsArray(MemberInfo member) { }
+ public void AddAsMap(MemberInfo member) { }
+ public void AddAsProperty(MemberInfo member) { }
+ public void AddAsPersistentMember(MemberInfo member) { }
+ public void AddAsPropertySplit(SplitDefinition definition) { }
+ public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) { }
+
+ #endregion
+ }
private readonly MemberInfo property = typeof (MyClass).GetProperty("Bar");
[Test]
@@ -282,6 +577,21 @@
destination.ComposedIds.Should().Have.Count.EqualTo(1);
}
+ [Test]
+ public void MergeShouldGetAllPropertiesOfPatternsAppliersHolderOfBothSide()
+ {
+ // this test is to check that, at least, we are getting all properties (to avoid to forget something)
+ string[] propertiesOfIPatternsAppliersHolder =
+ typeof(IModelExplicitDeclarationsHolder).GetProperties().Select(x => x.Name).ToArray();
+
+ var first = new ExplicitDeclarationsHolderMock();
+ var second = new ExplicitDeclarationsHolderMock();
+
+ first.Merge(second);
+
+ second.PropertiesGettersUsed.Should().Have.SameValuesAs(propertiesOfIPatternsAppliersHolder);
+ }
+
#region Nested type: MyClass
private class MyClass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-04-27 22:04:31
|
Revision: 5779
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5779&view=rev
Author: fabiomaulo
Date: 2011-04-27 22:04:24 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Fixed merge of component-as-id customization
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 21:53:31 UTC (rev 5778)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 22:04:24 UTC (rev 5779)
@@ -354,6 +354,7 @@
MergeDictionary(mapKeyManyToManyCustomizers, source.mapKeyManyToManyCustomizers);
MergeDictionary(mapKeyElementCustomizers, source.mapKeyElementCustomizers);
MergeDictionary(dynamicComponentCustomizers, source.dynamicComponentCustomizers);
+ MergeDictionary(componentAsIdPropertyCustomizers, source.componentAsIdPropertyCustomizers);
}
#endregion
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:53:31 UTC (rev 5778)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 22:04:24 UTC (rev 5779)
@@ -343,5 +343,18 @@
called.Should().Be.True();
}
+ [Test]
+ public void MergeShouldMergeComponentAsIdAttributesMapper()
+ {
+ var emptyHolder = new CustomizersHolder();
+ var holder = new CustomizersHolder();
+ var called = false;
+
+ holder.AddCustomizer(propertyPath, (IComponentAsIdAttributesMapper x) => called = true);
+ emptyHolder.Merge(holder);
+ emptyHolder.InvokeCustomizers(propertyPath, (IComponentAsIdAttributesMapper)null);
+
+ called.Should().Be.True();
+ }
}
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|