|
From: <fab...@us...> - 2011-04-05 17:26:21
|
Revision: 5611
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5611&view=rev
Author: fabiomaulo
Date: 2011-04-05 17:26:13 +0000 (Tue, 05 Apr 2011)
Log Message:
-----------
ClassCustomizer with Joins
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
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/Impl/ICustomizersHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -29,6 +29,8 @@
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>();
#region IModelExplicitDeclarationsHolder Members
@@ -132,6 +134,27 @@
get { return properties; }
}
+ 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))
@@ -343,6 +366,32 @@
properties.Add(member);
}
+ public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member)
+ {
+ /* 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 */
+
+ var memberKey = member.GetMemberFromDeclaringType();
+ string splitGroup;
+ if (!memberSplitGroup.TryGetValue(memberKey, out splitGroup))
+ {
+ AddTypeSplits(propertyContainer, splitGroupId);
+ memberSplitGroup[memberKey] = splitGroupId;
+ }
+ }
+
+ 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
@@ -370,7 +419,7 @@
public bool IsTablePerClassSplit(System.Type type, object splitGroupId, MemberInfo member)
{
- return false;
+ return Equals(splitGroupId, GetSplitGroupFor(member));
}
public bool IsTablePerClassHierarchy(System.Type type)
@@ -518,7 +567,7 @@
public IEnumerable<string> GetPropertiesSplits(System.Type type)
{
- return null;
+ return GetSplitGroupsFor(type);
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -135,6 +136,16 @@
get { return properties; }
}
+ public IEnumerable<string> GetSplitGroupsFor(System.Type type)
+ {
+ return Enumerable.Empty<string>();
+ }
+
+ public string GetSplitGroupFor(MemberInfo member)
+ {
+ return null;
+ }
+
public void AddAsRootEntity(System.Type type) {}
public void AddAsComponent(System.Type type) {}
@@ -176,6 +187,7 @@
public void AddAsMap(MemberInfo member) {}
public void AddAsProperty(MemberInfo member) {}
+ public void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member) {}
#endregion
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IJoinMapper.cs
===================================================================
(Binary files differ)
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -28,6 +28,8 @@
IEnumerable<MemberInfo> Arrays { get; }
IEnumerable<MemberInfo> Dictionaries { get; }
IEnumerable<MemberInfo> Properties { get; }
+ IEnumerable<string> GetSplitGroupsFor(System.Type type);
+ string GetSplitGroupFor(MemberInfo member);
void AddAsRootEntity(System.Type type);
void AddAsComponent(System.Type type);
@@ -52,5 +54,6 @@
void AddAsArray(MemberInfo member);
void AddAsMap(MemberInfo member);
void AddAsProperty(MemberInfo member);
+ void AddAsPropertySplit(System.Type propertyContainer, string splitGroupId, MemberInfo member);
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -50,7 +50,7 @@
#endregion
- private Dictionary<string, IJoinMapper> JoinMappers
+ public Dictionary<string, IJoinMapper> JoinMappers
{
get { return joinMappers ?? (joinMappers = new Dictionary<string, IJoinMapper>()); }
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -53,8 +53,8 @@
private readonly Dictionary<PropertyPath, List<Action<IPropertyMapper>>> propertyCustomizers =
new Dictionary<PropertyPath, List<Action<IPropertyMapper>>>();
- private readonly Dictionary<System.Type, List<Action<IClassAttributesMapper>>> rootClassCustomizers =
- new Dictionary<System.Type, List<Action<IClassAttributesMapper>>>();
+ private readonly Dictionary<System.Type, List<Action<IClassMapper>>> rootClassCustomizers =
+ new Dictionary<System.Type, List<Action<IClassMapper>>>();
private readonly Dictionary<PropertyPath, List<Action<ISetPropertiesMapper>>> setCustomizers =
new Dictionary<PropertyPath, List<Action<ISetPropertiesMapper>>>();
@@ -65,9 +65,12 @@
private readonly Dictionary<System.Type, List<Action<IUnionSubclassAttributesMapper>>> unionClassCustomizers =
new Dictionary<System.Type, List<Action<IUnionSubclassAttributesMapper>>>();
+ private readonly Dictionary<System.Type, List<Action<IJoinAttributesMapper>>> joinCustomizers =
+ new Dictionary<System.Type, List<Action<IJoinAttributesMapper>>>();
+
#region ICustomizersHolder Members
- public void AddCustomizer(System.Type type, Action<IClassAttributesMapper> classCustomizer)
+ public void AddCustomizer(System.Type type, Action<IClassMapper> classCustomizer)
{
AddCustomizer(rootClassCustomizers, type, classCustomizer);
}
@@ -92,6 +95,11 @@
AddCustomizer(componentClassCustomizers, type, classCustomizer);
}
+ public void AddCustomizer(System.Type type, Action<IJoinAttributesMapper> joinCustomizer)
+ {
+ AddCustomizer(joinCustomizers, type, joinCustomizer);
+ }
+
public void AddCustomizer(PropertyPath member, Action<IPropertyMapper> propertyCustomizer)
{
AddCustomizer(propertyCustomizers, member, propertyCustomizer);
@@ -167,7 +175,7 @@
AddCustomizer(mapKeyElementCustomizers, member, mapKeyElementCustomizer);
}
- public void InvokeCustomizers(System.Type type, IClassAttributesMapper mapper)
+ public void InvokeCustomizers(System.Type type, IClassMapper mapper)
{
InvokeCustomizers(rootClassCustomizers, type, mapper);
}
@@ -192,6 +200,11 @@
InvokeCustomizers(componentClassCustomizers, type, mapper);
}
+ public void InvokeCustomizers(System.Type type, IJoinAttributesMapper mapper)
+ {
+ InvokeCustomizers(joinCustomizers, type, mapper);
+ }
+
public void InvokeCustomizers(PropertyPath member, IPropertyMapper mapper)
{
InvokeCustomizers(propertyCustomizers, member, mapper);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using NHibernate.Persister.Entity;
@@ -7,6 +8,8 @@
{
public class ClassCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IClassMapper<TEntity> where TEntity : class
{
+ private Dictionary<string, IJoinMapper<TEntity>> joinCustomizers;
+
public ClassCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder)
: base(explicitDeclarationsHolder, customizersHolder, null)
{
@@ -17,6 +20,11 @@
explicitDeclarationsHolder.AddAsRootEntity(typeof (TEntity));
}
+ private Dictionary<string, IJoinMapper<TEntity>> JoinCustomizers
+ {
+ get { return joinCustomizers ?? (joinCustomizers = new Dictionary<string, IJoinMapper<TEntity>>()); }
+ }
+
#region Implementation of IClassAttributesMapper<TEntity>
public void Id(Action<IIdMapper> idMapper)
@@ -39,27 +47,27 @@
public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Discriminator(discriminatorMapping));
+ CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassMapper m) => m.Discriminator(discriminatorMapping));
}
public void DiscriminatorValue(object value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DiscriminatorValue(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DiscriminatorValue(value));
}
public void Table(string tableName)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Table(tableName));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Table(tableName));
}
public void Catalog(string catalogName)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Catalog(catalogName));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Catalog(catalogName));
}
public void Schema(string schemaName)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Schema(schemaName));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Schema(schemaName));
}
#endregion
@@ -68,20 +76,20 @@
public void Mutable(bool isMutable)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Mutable(isMutable));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Mutable(isMutable));
}
public void Version<TProperty>(Expression<Func<TEntity, TProperty>> versionProperty, Action<IVersionMapper> versionMapping)
{
MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(versionProperty);
ExplicitDeclarationsHolder.AddAsVersionProperty(member);
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Version(member, versionMapping));
+ 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));
- CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassAttributesMapper m) => m.NaturalId(nidm => naturalIdMapping(nidm)));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.NaturalId(nidm => naturalIdMapping(nidm)));
}
public void NaturalId(Action<IBasePlainPropertyContainerMapper<TEntity>> naturalIdPropertiesMapping)
@@ -91,67 +99,76 @@
public void Cache(Action<ICacheMapper> cacheMapping)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Cache(cacheMapping));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Cache(cacheMapping));
}
public void Filter(string filterName, Action<IFilterMapper> filterMapping)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Filter(filterName, filterMapping));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Filter(filterName, filterMapping));
}
public void Where(string whereClause)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Where(whereClause));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Where(whereClause));
}
public void SchemaAction(SchemaAction action)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SchemaAction(action));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SchemaAction(action));
}
public void Join(string splitGroupId, Action<IJoinMapper<TEntity>> splittedMapping)
{
- throw new NotImplementedException();
+ // add the customizer only to create the JoinMapper instance
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Join(splitGroupId, j => { }));
+
+ IJoinMapper<TEntity> joinCustomizer;
+ if (!JoinCustomizers.TryGetValue(splitGroupId, out joinCustomizer))
+ {
+ joinCustomizer = new JoinCustomizer<TEntity>(splitGroupId, ExplicitDeclarationsHolder, CustomizersHolder);
+ JoinCustomizers.Add(splitGroupId, joinCustomizer);
+ }
+ splittedMapping(joinCustomizer);
}
public void EntityName(string value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.EntityName(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.EntityName(value));
}
public void Proxy(System.Type proxy)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Proxy(proxy));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Proxy(proxy));
}
public void Lazy(bool value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Lazy(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Lazy(value));
}
public void DynamicUpdate(bool value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DynamicUpdate(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DynamicUpdate(value));
}
public void DynamicInsert(bool value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.DynamicInsert(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.DynamicInsert(value));
}
public void BatchSize(int value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.BatchSize(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.BatchSize(value));
}
public void SelectBeforeUpdate(bool value)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SelectBeforeUpdate(value));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SelectBeforeUpdate(value));
}
public void Persister<T>() where T : IEntityPersister
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Persister<T>());
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Persister<T>());
}
#endregion
@@ -160,27 +177,27 @@
public void Loader(string namedQueryReference)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Loader(namedQueryReference));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Loader(namedQueryReference));
}
public void SqlInsert(string sql)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlInsert(sql));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlInsert(sql));
}
public void SqlUpdate(string sql)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlUpdate(sql));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlUpdate(sql));
}
public void SqlDelete(string sql)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.SqlDelete(sql));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.SqlDelete(sql));
}
public void Subselect(string sql)
{
- CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassAttributesMapper m) => m.Subselect(sql));
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IClassMapper m) => m.Subselect(sql));
}
#endregion
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -0,0 +1,168 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl
+{
+ public class JoinCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IJoinMapper<TEntity>
+ where TEntity : class
+ {
+ private readonly string splitGroupId;
+ private readonly IKeyMapper<TEntity> keyMapper;
+
+ public JoinCustomizer(string splitGroupId, IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder)
+ : base(explicitDeclarationsHolder, customizersHolder, null)
+ {
+ if (explicitDeclarationsHolder == null)
+ {
+ throw new ArgumentNullException("explicitDeclarationsHolder");
+ }
+ this.splitGroupId = splitGroupId;
+ keyMapper = new JoinKeyCustomizer<TEntity>(customizersHolder);
+ }
+
+ public void Loader(string namedQueryReference)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Loader(namedQueryReference));
+ }
+
+ public void SqlInsert(string sql)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlInsert(sql));
+ }
+
+ public void SqlUpdate(string sql)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlUpdate(sql));
+ }
+
+ public void SqlDelete(string sql)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.SqlDelete(sql));
+ }
+
+ public void Subselect(string sql)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Subselect(sql));
+ }
+
+ public void Table(string tableName)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Table(tableName));
+ }
+
+ public void Catalog(string catalogName)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Catalog(catalogName));
+ }
+
+ public void Schema(string schemaName)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Schema(schemaName));
+ }
+
+ public void Key(Action<IKeyMapper<TEntity>> keyMapping)
+ {
+ keyMapping(keyMapper);
+ }
+
+ public void Inverse(bool value)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Inverse(value));
+ }
+
+ public void Optional(bool isOptional)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Optional(isOptional));
+ }
+
+ public void Fetch(FetchKind fetchMode)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Fetch(fetchMode));
+ }
+
+ public override void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Set(property, collectionMapping, mapping);
+ }
+
+ public override void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Bag(property, collectionMapping, mapping);
+ }
+
+ public override void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property, Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.List(property, collectionMapping, mapping);
+ }
+
+ public override 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)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Map(property, collectionMapping, keyMapping, mapping);
+ }
+
+ public override void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property, Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping, Action<ICollectionElementRelation<TElement>> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Map(property, collectionMapping, mapping);
+ }
+
+ public override void Property<TProperty>(Expression<Func<TEntity, TProperty>> property)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Property(property);
+ }
+
+ public override void Property<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IPropertyMapper> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Property(property, mapping);
+ }
+
+ public override void Property(FieldInfo member, Action<IPropertyMapper> mapping)
+ {
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Property(member, mapping);
+ }
+
+ public override void Component<TComponent>(Expression<Func<TEntity, TComponent>> property, Action<IComponentMapper<TComponent>> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Component(property, mapping);
+ }
+
+ public override void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.ManyToOne(property, mapping);
+ }
+
+ public override void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.ManyToOne(property);
+ }
+
+ public override void Any<TProperty>(Expression<Func<TEntity, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPropertySplit(typeof (TEntity), splitGroupId, member);
+ base.Any(property, idTypeOfMetaType, mapping);
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinKeyCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -0,0 +1,57 @@
+using System;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl
+{
+ public class JoinKeyCustomizer<TEntity> : IKeyMapper<TEntity>
+ where TEntity : class
+ {
+ public JoinKeyCustomizer(ICustomizersHolder customizersHolder)
+ {
+ CustomizersHolder = customizersHolder;
+ }
+
+ public ICustomizersHolder CustomizersHolder { get; private set; }
+
+ #region Implementation of IKeyMapper<TEntity>
+
+ public void Column(Action<IColumnMapper> columnMapper)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Column(columnMapper)));
+ }
+
+ public void Columns(params Action<IColumnMapper>[] columnMapper)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Columns(columnMapper)));
+ }
+
+ public void Column(string columnName)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Column(columnName)));
+ }
+
+ public void OnDelete(OnDeleteAction deleteAction)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.OnDelete(deleteAction)));
+ }
+
+ public void PropertyRef<TProperty>(Expression<Func<TEntity, TProperty>> propertyGetter)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(propertyGetter);
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.PropertyRef(member)));
+ }
+
+ public void Update(bool consideredInUpdateQuery)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.Update(consideredInUpdateQuery)));
+ }
+
+ public void ForeignKey(string foreingKeyName)
+ {
+ CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinAttributesMapper m) => m.Key(x => x.ForeignKey(foreingKeyName)));
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -27,7 +27,7 @@
get { return explicitDeclarationsHolder; }
}
- public void Property<TProperty>(Expression<Func<TEntity, TProperty>> property)
+ public virtual void Property<TProperty>(Expression<Func<TEntity, TProperty>> property)
{
Property(property, x => { });
}
@@ -97,7 +97,7 @@
explicitDeclarationsHolder.AddAsAny(memberOf);
}
- public void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
+ public virtual void Set<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<ISetPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
{
@@ -110,7 +110,7 @@
mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
}
- public void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
+ public virtual void Bag<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IBagPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
{
@@ -123,7 +123,7 @@
mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, memberOf), CustomizersHolder));
}
- public void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
+ public virtual void List<TElement>(Expression<Func<TEntity, IEnumerable<TElement>>> property,
Action<IListPropertiesMapper<TEntity, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
{
@@ -136,7 +136,7 @@
mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, new PropertyPath(PropertyPath, member), CustomizersHolder));
}
- public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
+ public virtual 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)
@@ -154,7 +154,7 @@
mapping(new CollectionElementRelationCustomizer<TElement>(explicitDeclarationsHolder, memberOfPath, CustomizersHolder));
}
- public void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
+ public virtual void Map<TKey, TElement>(Expression<Func<TEntity, IDictionary<TKey, TElement>>> property,
Action<IMapPropertiesMapper<TEntity, TKey, TElement>> collectionMapping,
Action<ICollectionElementRelation<TElement>> mapping)
{
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -4,11 +4,12 @@
{
public interface ICustomizersHolder
{
- void AddCustomizer(System.Type type, Action<IClassAttributesMapper> classCustomizer);
+ void AddCustomizer(System.Type type, Action<IClassMapper> classCustomizer);
void AddCustomizer(System.Type type, Action<ISubclassAttributesMapper> classCustomizer);
void AddCustomizer(System.Type type, Action<IJoinedSubclassAttributesMapper> classCustomizer);
void AddCustomizer(System.Type type, Action<IUnionSubclassAttributesMapper> classCustomizer);
void AddCustomizer(System.Type type, Action<IComponentAttributesMapper> classCustomizer);
+ void AddCustomizer(System.Type type, Action<IJoinAttributesMapper> classCustomizer);
void AddCustomizer(PropertyPath member, Action<IPropertyMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<IManyToOneMapper> propertyCustomizer);
@@ -22,11 +23,12 @@
void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer);
- void InvokeCustomizers(System.Type type, IClassAttributesMapper mapper);
+ void InvokeCustomizers(System.Type type, IClassMapper mapper);
void InvokeCustomizers(System.Type type, ISubclassAttributesMapper mapper);
void InvokeCustomizers(System.Type type, IJoinedSubclassAttributesMapper mapper);
void InvokeCustomizers(System.Type type, IUnionSubclassAttributesMapper mapper);
void InvokeCustomizers(System.Type type, IComponentAttributesMapper mapper);
+ void InvokeCustomizers(System.Type type, IJoinAttributesMapper mapper);
void InvokeCustomizers(PropertyPath member, IPropertyMapper mapper);
void InvokeCustomizers(PropertyPath member, IManyToOneMapper mapper);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -685,7 +685,6 @@
InvokeBeforeMapClass(type, classMapper);
InvokeClassCustomizers(type, classMapper);
- InvokeAfterMapClass(type, classMapper);
MemberInfo[] naturalIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray();
if (naturalIdPropeties.Length > 0)
@@ -698,18 +697,87 @@
}
});
}
+ var splitGroups = modelInspector.GetPropertiesSplits(type);
+ var propertiesToMap = persistentProperties.Where(mi => !modelInspector.IsVersion(mi)).Except(naturalIdPropeties).ToList();
+ var propertiesInSplits = new HashSet<MemberInfo>();
+ foreach (var splitGroup in splitGroups)
+ {
+ var groupId= splitGroup;
+ var propertiesOfTheGroup = propertiesToMap.Where(p => modelInspector.IsTablePerClassSplit(type, groupId, p)).ToList();
+ IJoinMapper joinMapper;
+ if (propertiesOfTheGroup.Count > 0 && classMapper.JoinMappers.TryGetValue(groupId, out joinMapper))
+ {
+ MapProperties(type, propertiesOfTheGroup, joinMapper);
+ propertiesInSplits.UnionWith(propertiesOfTheGroup);
+ }
+ }
- MapProperties(type, persistentProperties.Where(mi => !modelInspector.IsVersion(mi)).Except(naturalIdPropeties), classMapper);
+ MapProperties(type, propertiesToMap.Except(propertiesInSplits), classMapper);
+ InvokeAfterMapClass(type, classMapper);
}
- private void InvokeClassCustomizers(System.Type type, IClassAttributesMapper classMapper)
+ private void MapProperties(System.Type propertiesContainerType, IEnumerable<MemberInfo> propertiesToMap, IJoinMapper propertiesContainer)
{
+ foreach (var property in propertiesToMap)
+ {
+ MemberInfo member = property;
+ System.Type propertyType = property.GetPropertyOrFieldType();
+ var memberPath = new PropertyPath(null, member);
+ if (modelInspector.IsProperty(member))
+ {
+ MapProperty(member, memberPath, propertiesContainer);
+ }
+ else if (modelInspector.IsAny(member))
+ {
+ MapAny(member, memberPath, propertiesContainer);
+ }
+ else if (modelInspector.IsManyToOne(property))
+ {
+ MapManyToOne(member, memberPath, propertiesContainer);
+ }
+ else if (modelInspector.IsSet(property))
+ {
+ MapSet(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
+ }
+ else if (modelInspector.IsDictionary(property))
+ {
+ MapDictionary(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
+ }
+ else if (modelInspector.IsArray(property))
+ {
+ throw new NotSupportedException();
+ }
+ else if (modelInspector.IsList(property))
+ {
+ MapList(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
+ }
+ else if (modelInspector.IsBag(property))
+ {
+ MapBag(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
+ }
+ else if (modelInspector.IsComponent(propertyType))
+ {
+ MapComponent(member, memberPath, propertyType, propertiesContainer, propertiesContainerType);
+ }
+ else
+ {
+ MapProperty(member, memberPath, propertiesContainer);
+ }
+ }
+ }
+
+ private void InvokeClassCustomizers(System.Type type, ClassMapper classMapper)
+ {
InvokeAncestorsCustomizers(type.GetInterfaces(), classMapper);
InvokeAncestorsCustomizers(type.GetHierarchyFromBase(), classMapper);
customizerHolder.InvokeCustomizers(type, classMapper);
+ foreach (var joinMapper in classMapper.JoinMappers.Values)
+ {
+ customizerHolder.InvokeCustomizers(type, joinMapper);
+ }
}
- private void InvokeAncestorsCustomizers(IEnumerable<System.Type> typeAncestors, IClassAttributesMapper classMapper)
+ private void InvokeAncestorsCustomizers(IEnumerable<System.Type> typeAncestors, IClassMapper classMapper)
{
// only apply the polymorphic mapping for no entities:
// this is to avoid a possible caos in entity-subclassing:
@@ -924,7 +992,7 @@
});
}
- private void MapBag(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer,
+ private void MapBag(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer,
System.Type propertiesContainerType)
{
System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType);
@@ -938,7 +1006,7 @@
}, cert.Map);
}
- private void MapList(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer,
+ private void MapList(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer,
System.Type propertiesContainerType)
{
System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType);
@@ -952,7 +1020,7 @@
}, cert.Map);
}
- private void MapDictionary(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer,
+ private void MapDictionary(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer,
System.Type propertiesContainerType)
{
System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType();
@@ -975,7 +1043,7 @@
}, mkrm.Map, cert.Map);
}
- private void MapSet(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer,
+ private void MapSet(MemberInfo member, PropertyPath propertyPath, System.Type propertyType, ICollectionPropertiesContainerMapper propertiesContainer,
System.Type propertiesContainerType)
{
System.Type collectionElementType = GetCollectionElementTypeOrThrow(propertiesContainerType, member, propertyType);
@@ -989,7 +1057,7 @@
}, cert.Map);
}
- private void MapOneToOne(MemberInfo member, PropertyPath propertyPath, IPropertyContainerMapper propertiesContainer)
+ private void MapOneToOne(MemberInfo member, PropertyPath propertyPath, IPlainPropertyContainerMapper propertiesContainer)
{
propertiesContainer.OneToOne(member, oneToOneMapper =>
{
@@ -1092,7 +1160,7 @@
x.Parent(parentReferenceProperty,
componentParentMapper =>
{
-/* TODO */
+ /* TODO */
}
);
}
@@ -1147,7 +1215,7 @@
{
x.Parent(parentReferenceProperty, componentParentMapper =>
{
-/* TODO */
+ /* TODO */
});
}
customizersHolder.InvokeCustomizers(componentPropertyType, x);
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-05 17:26:13 UTC (rev 5611)
@@ -345,8 +345,10 @@
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\CollectionPropertiesCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentElementCustomizer.cs" />
+ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinedSubclassKeyCustomizer.cs" />
+ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\JoinKeyCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ListPropertiesCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ManyToManyCustomizer.cs" />
<Compile Include="Mapping\ByCode\Impl\CustomizersImpl\MapKeyComponentCustomizer.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExplicitlyDeclaredModelTests/SplitPropertiesRegistrationTests.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -0,0 +1,47 @@
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ExplicitlyDeclaredModelTests
+{
+ public class SplitPropertiesRegistrationTests
+ {
+ private class MyClass
+ {
+ public string Something { get; set; }
+ }
+
+ private class Inherited : MyClass
+ {
+ public string SomethingElse { get; set; }
+ }
+
+ [Test]
+ public void WhenRegisterPropertySplitsThenTypeHasSplitGroups()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ inspector.AddAsPropertySplit(typeof(MyClass), "group", For<MyClass>.Property(x => x.Something));
+ inspector.AddAsPropertySplit(typeof(Inherited), "group1", For<Inherited>.Property(x => x.SomethingElse));
+
+ inspector.GetSplitGroupsFor(typeof(MyClass)).Should().Have.SameValuesAs("group");
+ inspector.GetSplitGroupsFor(typeof(Inherited)).Should().Have.SameValuesAs("group1");
+ }
+
+ [Test]
+ public void WhenRegisterPropertySplitMoreThanOnceThenIgnore()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ var memberFromDeclaringType = For<MyClass>.Property(x=> x.Something);
+ var memberFromReferencedType = typeof(Inherited).GetProperty("Something");
+
+ inspector.AddAsPropertySplit(typeof(MyClass), "group", memberFromDeclaringType);
+ inspector.AddAsPropertySplit(typeof(Inherited), "group1", memberFromReferencedType);
+
+ inspector.GetSplitGroupsFor(typeof(MyClass)).Should().Have.SameValuesAs("group");
+ inspector.GetSplitGroupsFor(typeof(Inherited)).Should().Be.Empty();
+
+ inspector.GetSplitGroupFor(memberFromDeclaringType).Should().Be("group");
+ inspector.GetSplitGroupFor(memberFromReferencedType).Should().Be("group");
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs 2011-04-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/RootClassPropertiesSplitsTests.cs 2011-04-05 17:26:13 UTC (rev 5611)
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
using NHibernate.Mapping.ByCode;
using NUnit.Framework;
using SharpTestsEx;
@@ -17,7 +18,7 @@
public string SomethingB2 { get; set; }
}
- [Test, Ignore("Not implemented yet")]
+ [Test]
public void WhenSplittedPropertiesThenRegisterSplitGroupIds()
{
var inspector = new ExplicitlyDeclaredModel();
@@ -42,7 +43,7 @@
tablePerClassSplits.Should().Have.SameValuesAs("MyClassSplit1", "MyClassSplit2");
}
- [Test, Ignore("Not implemented yet")]
+ [Test]
public void WhenSplittedPropertiesThenRegister()
{
var inspector = new ExplicitlyDeclaredModel();
@@ -71,5 +72,36 @@
inspector.IsTablePerClassSplit(typeof(MyClass), "MyClassSplit2", For<MyClass>.Property(x => x.SomethingB1)).Should().Be.True();
inspector.IsTablePerClassSplit(typeof(MyClass), "MyClassSplit2", For<MyClass>.Property(x => x.SomethingB2)).Should().Be.True();
}
+
+ [Test]
+ public void WhenMapSplittedPropertiesThenEachPropertyIsInItsSplitGroup()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ var mapper = new ModelMapper(inspector);
+ mapper.Class<MyClass>(map =>
+ {
+ map.Id(x => x.Id, idmap => { });
+ map.Join("MyClassSplit1", mj =>
+ {
+ mj.Property(x => x.SomethingA1);
+ mj.Property(x => x.SomethingA2);
+ });
+ map.Join("MyClassSplit2", mj =>
+ {
+ mj.Property(x => x.SomethingB1);
+ mj.Property(x => x.SomethingB2);
+ });
+ map.Property(x => x.Something0);
+ });
+ var hbmDoc = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+
+ var hbmClass = hbmDoc.RootClasses[0];
+ hbmClass.Joins.Select(j => j.table).Should().Have.SameValuesAs("MyClassSplit1", "MyClassSplit2");
+ hbmClass.Properties.Single().Name.Should().Be("Something0");
+ var hbmSplit1 = hbmClass.Joins.Single(j => "MyClassSplit1" == j.table);
+ hbmSplit1.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingA1", "SomethingA2");
+ var hbmSplit2 = hbmClass.Joins.Single(j => "MyClassSplit2" == j.table);
+ hbmSplit2.Properties.Select(p => p.Name).Should().Have.SameValuesAs("SomethingB1", "SomethingB2");
+ }
}
}
\ 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-05 01:28:51 UTC (rev 5610)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-05 17:26:13 UTC (rev 5611)
@@ -508,6 +508,7 @@
<Compile Include="Linq\ByMethod\SumTests.cs" />
<Compile Include="Logging\Log4NetLoggerTest.cs" />
<Compile Include="Logging\LoggerProviderTest.cs" />
+ <Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\SplitPropertiesRegistrationTests.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\BasicMappingOfSimpleClass.cs" />
<Compile Include="MappingByCode\ExpliticMappingTests\ColumnsNamingConvetions.cs" />
<Compile Include="MappingByCode\ExplicitlyDeclaredModelTests\ComponentMappingRegistrationTests.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|