|
From: <fab...@us...> - 2011-04-27 14:36:22
|
Revision: 5774
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5774&view=rev
Author: fabiomaulo
Date: 2011-04-27 14:36:13 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
IModelInspector and IModelExplicitDeclarationsHolder managing composed-id
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -17,6 +17,7 @@
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>();
@@ -92,6 +93,11 @@
get { return poids; }
}
+ public IEnumerable<MemberInfo> ComposedIds
+ {
+ get { return composedIds; }
+ }
+
public IEnumerable<MemberInfo> VersionProperties
{
get { return versionProperties; }
@@ -330,6 +336,12 @@
poids.Add(member);
}
+ public void AddAsPartOfComposedId(MemberInfo member)
+ {
+ persistentMembers.Add(member);
+ composedIds.Add(member);
+ }
+
public void AddAsVersionProperty(MemberInfo member)
{
persistentMembers.Add(member);
@@ -502,6 +514,11 @@
return poids.Contains(member);
}
+ public bool IsMemberOfComposedId(MemberInfo member)
+ {
+ return composedIds.Contains(member);
+ }
+
public virtual bool IsVersion(MemberInfo member)
{
return versionProperties.Contains(member);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -20,6 +19,7 @@
private readonly IEnumerable<MemberInfo> oneToManyRelations = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>();
+ private readonly IEnumerable<MemberInfo> composedIds = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> dynamicComponents = Enumerable.Empty<MemberInfo>();
private readonly IEnumerable<MemberInfo> persistentMembers = new HashSet<MemberInfo>();
@@ -94,6 +94,11 @@
get { return poids; }
}
+ public IEnumerable<MemberInfo> ComposedIds
+ {
+ get { return composedIds; }
+ }
+
public IEnumerable<MemberInfo> VersionProperties
{
get { return versionProperties; }
@@ -192,6 +197,7 @@
public void AddAsAny(MemberInfo member) {}
public void AddAsPoid(MemberInfo member) {}
+ public void AddAsPartOfComposedId(MemberInfo member) {}
public void AddAsVersionProperty(MemberInfo member) {}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -32,6 +32,7 @@
IEnumerable<MemberInfo> Any { get; }
IEnumerable<MemberInfo> Poids { get; }
+ IEnumerable<MemberInfo> ComposedIds { get; }
IEnumerable<MemberInfo> VersionProperties { get; }
IEnumerable<MemberInfo> NaturalIds { get; }
@@ -63,6 +64,7 @@
void AddAsAny(MemberInfo member);
void AddAsPoid(MemberInfo member);
+ void AddAsPartOfComposedId(MemberInfo member);
void AddAsVersionProperty(MemberInfo member);
void AddAsNaturalId(MemberInfo member);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -21,6 +21,7 @@
bool IsAny(MemberInfo member);
bool IsPersistentId(MemberInfo member);
+ bool IsMemberOfComposedId(MemberInfo member);
bool IsVersion(MemberInfo member);
bool IsMemberOfNaturalId(MemberInfo member);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -19,6 +19,7 @@
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 Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>();
@@ -88,6 +89,11 @@
get { return poids; }
}
+ public IEnumerable<MemberInfo> ComposedIds
+ {
+ get { return composedIds; }
+ }
+
public IEnumerable<MemberInfo> VersionProperties
{
get { return versionProperties; }
@@ -220,6 +226,11 @@
poids.Add(member);
}
+ public void AddAsPartOfComposedId(MemberInfo member)
+ {
+ composedIds.Add(member);
+ }
+
public void AddAsVersionProperty(MemberInfo member)
{
versionProperties.Add(member);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -24,6 +24,7 @@
System.Array.ForEach(source.Any.ToArray(), destination.AddAsAny);
System.Array.ForEach(source.Poids.ToArray(), destination.AddAsPoid);
+ System.Array.ForEach(source.ComposedIds.ToArray(), destination.AddAsPartOfComposedId);
System.Array.ForEach(source.VersionProperties.ToArray(), destination.AddAsVersionProperty);
System.Array.ForEach(source.NaturalIds.ToArray(), destination.AddAsNaturalId);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -472,6 +472,16 @@
declaredModel.AddAsDynamicComponent(member, componentTemplate);
}
+ IEnumerable<MemberInfo> IModelExplicitDeclarationsHolder.ComposedIds
+ {
+ get { return declaredModel.ComposedIds; }
+ }
+
+ void IModelExplicitDeclarationsHolder.AddAsPartOfComposedId(MemberInfo member)
+ {
+ declaredModel.AddAsPartOfComposedId(member);
+ }
+
#endregion
#region Implementation of IModelInspector
@@ -554,6 +564,11 @@
return isPersistentId(member, declaredResult);
}
+ bool IModelInspector.IsMemberOfComposedId(MemberInfo member)
+ {
+ return declaredModel.IsPersistentId(member);
+ }
+
bool IModelInspector.IsVersion(MemberInfo member)
{
bool declaredResult = declaredModel.IsVersion(member);
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 13:53:14 UTC (rev 5773)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-27 14:36:13 UTC (rev 5774)
@@ -271,6 +271,17 @@
destination.GetDynamicComponentTemplate(property).Should().Be(typeof(MyClass));
}
+ [Test]
+ public void MergeComposedId()
+ {
+ var destination = new ExplicitDeclarationsHolder();
+ var source = new ExplicitDeclarationsHolder();
+ source.AddAsPartOfComposedId(property);
+
+ destination.Merge(source);
+ destination.ComposedIds.Should().Have.Count.EqualTo(1);
+ }
+
#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 18:54:54
|
Revision: 5775
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5775&view=rev
Author: fabiomaulo
Date: 2011-04-27 18:54:47 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
The end composed-id
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.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/ICustomizersHolder.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -42,10 +42,10 @@
void Id<TProperty>(Expression<Func<TEntity, TProperty>> idProperty, Action<IIdMapper> idMapper);
void Id(FieldInfo idProperty, Action<IIdMapper> idMapper);
- //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class;
- //void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class;
+ void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class;
+ void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class;
- //void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping);
+ void ComposedId(Action<IComposedIdMapper<TEntity>> idPropertiesMapping);
void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping);
void DiscriminatorValue(object value);
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -23,6 +23,7 @@
void Class<TConcrete>() where TConcrete : TComponent;
}
- public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent> where TComponent : class { }
+ public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent>
+ { }
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdLikeComponetAttributesMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -0,0 +1,53 @@
+using System;
+using System.Reflection;
+
+namespace NHibernate.Mapping.ByCode.Impl
+{
+ public class ComponentAsIdLikeComponetAttributesMapper : IComponentAttributesMapper
+ {
+ private readonly IComponentAsIdMapper realMapper;
+
+ public ComponentAsIdLikeComponetAttributesMapper(IComponentAsIdMapper realMapper)
+ {
+ if (realMapper == null)
+ {
+ throw new ArgumentNullException("realMapper");
+ }
+ this.realMapper = realMapper;
+ }
+
+ #region IComponentAttributesMapper Members
+
+ public void Access(Accessor accessor)
+ {
+ realMapper.Access(accessor);
+ }
+
+ public void Access(System.Type accessorType)
+ {
+ realMapper.Access(accessorType);
+ }
+
+ public void OptimisticLock(bool takeInConsiderationForOptimisticLock) {}
+
+ public void Parent(MemberInfo parent)
+ {
+ // the mapping of the Parent can be used as a ManyToOne but could be strange to have a bidirectional relation in the PK
+ }
+
+ public void Parent(MemberInfo parent, Action<IComponentParentMapper> parentMapping) {}
+
+ public void Update(bool consideredInUpdateQuery) {}
+
+ public void Insert(bool consideredInInsertQuery) {}
+
+ public void Lazy(bool isLazy) {}
+
+ public void Class(System.Type componentType)
+ {
+ realMapper.Class(componentType);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -33,6 +33,9 @@
private readonly Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>> componentPropertyCustomizers =
new Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>>();
+ private readonly Dictionary<PropertyPath, List<Action<IComponentAsIdAttributesMapper>>> componentAsIdPropertyCustomizers =
+ new Dictionary<PropertyPath, List<Action<IComponentAsIdAttributesMapper>>>();
+
private readonly Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>> dynamicComponentCustomizers =
new Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>>();
@@ -162,6 +165,11 @@
AddCustomizer(componentPropertyCustomizers, member, propertyCustomizer);
}
+ public void AddCustomizer(PropertyPath member, Action<IComponentAsIdAttributesMapper> propertyCustomizer)
+ {
+ AddCustomizer(componentAsIdPropertyCustomizers, member, propertyCustomizer);
+ }
+
public void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer)
{
AddCustomizer(dynamicComponentCustomizers, member, propertyCustomizer);
@@ -282,6 +290,11 @@
InvokeCustomizers(componentPropertyCustomizers, member, mapper);
}
+ public void InvokeCustomizers(PropertyPath member, IComponentAsIdAttributesMapper mapper)
+ {
+ InvokeCustomizers(componentAsIdPropertyCustomizers, member, mapper);
+ }
+
public void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper)
{
InvokeCustomizers(dynamicComponentCustomizers, 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-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ClassCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -52,6 +52,23 @@
CustomizersHolder.AddCustomizer(typeof(TEntity), m => m.Id(idProperty, idMapper));
}
+ public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty) where TComponent : class
+ {
+ ComponentAsId(idProperty, x => { });
+ }
+
+ public void ComponentAsId<TComponent>(Expression<Func<TEntity, TComponent>> idProperty, Action<IComponentAsIdMapper<TComponent>> idMapper) where TComponent : class
+ {
+ var member = TypeExtensions.DecodeMemberAccessExpression(idProperty);
+ 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));
+ }
+
public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping)
{
CustomizersHolder.AddCustomizer(typeof (TEntity), (IClassMapper m) => m.Discriminator(discriminatorMapping));
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComponentAsIdCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -0,0 +1,37 @@
+using System;
+
+namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl
+{
+ public class ComponentAsIdCustomizer<TComponent> : PropertyContainerCustomizer<TComponent>, IComponentAsIdMapper<TComponent> where TComponent : class
+ {
+ public ComponentAsIdCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder, PropertyPath propertyPath)
+ : base(explicitDeclarationsHolder, customizersHolder, propertyPath)
+ {
+ if (explicitDeclarationsHolder == null)
+ {
+ throw new ArgumentNullException("explicitDeclarationsHolder");
+ }
+ if (propertyPath == null)
+ {
+ throw new ArgumentNullException("propertyPath");
+ }
+ explicitDeclarationsHolder.AddAsComponent(typeof (TComponent));
+ explicitDeclarationsHolder.AddAsPoid(propertyPath.LocalMember);
+ }
+
+ public void Class<TConcrete>() where TConcrete : TComponent
+ {
+ CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Class(typeof(TConcrete)));
+ }
+
+ public void Access(Accessor accessor)
+ {
+ CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Access(accessor));
+ }
+
+ public void Access(System.Type accessorType)
+ {
+ CustomizersHolder.AddCustomizer(PropertyPath, (IComponentAsIdAttributesMapper m) => m.Access(accessorType));
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/ComposedIdCustomizer.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -0,0 +1,24 @@
+using System.Reflection;
+
+namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl
+{
+ public class ComposedIdCustomizer<TEntity> : PropertyContainerCustomizer<TEntity>, IComposedIdMapper<TEntity> where TEntity : class
+ {
+ public ComposedIdCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder)
+ : base(explicitDeclarationsHolder, customizersHolder, null) {}
+
+ protected override void RegisterPropertyMapping<TProperty>(System.Linq.Expressions.Expression<System.Func<TEntity, TProperty>> property, System.Action<IPropertyMapper> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPartOfComposedId(member);
+ base.RegisterPropertyMapping(property, mapping);
+ }
+
+ protected override void RegisterManyToOneMapping<TProperty>(System.Linq.Expressions.Expression<System.Func<TEntity, TProperty>> property, System.Action<IManyToOneMapper> mapping)
+ {
+ MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property);
+ ExplicitDeclarationsHolder.AddAsPartOfComposedId(member);
+ base.RegisterManyToOneMapping(property, mapping);
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -24,6 +24,7 @@
void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer);
+ void AddCustomizer(PropertyPath member, Action<IComponentAsIdAttributesMapper> propertyCustomizer);
void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer);
void InvokeCustomizers(System.Type type, IClassMapper mapper);
@@ -44,6 +45,7 @@
void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper);
void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper);
void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper);
+ void InvokeCustomizers(PropertyPath member, IComponentAsIdAttributesMapper mapper);
void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper);
#region Collection Element relations invokers
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -731,7 +731,42 @@
InvokeBeforeMapClass(type, classMapper);
InvokeClassCustomizers(type, classMapper);
- MemberInfo[] naturalIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray();
+ if (poidPropertyOrField != null && modelInspector.IsComponent(poidPropertyOrField.GetPropertyOrFieldType()))
+ {
+ classMapper.ComponentAsId(poidPropertyOrField, compoAsId =>
+ {
+ var memberPath = new PropertyPath(null, poidPropertyOrField);
+ var componentMapper = new ComponentAsIdLikeComponetAttributesMapper(compoAsId);
+ InvokeBeforeMapComponent(memberPath, componentMapper);
+
+ System.Type componentType = poidPropertyOrField.GetPropertyOrFieldType();
+ IEnumerable<MemberInfo> componentPersistentProperties =
+ membersProvider.GetComponentMembers(componentType).Where(p => modelInspector.IsPersistentProperty(p));
+
+ customizerHolder.InvokeCustomizers(componentType, componentMapper);
+ ForEachMemberPath(poidPropertyOrField, memberPath, pp => customizerHolder.InvokeCustomizers(pp, compoAsId));
+ InvokeAfterMapComponent(memberPath, componentMapper);
+
+ foreach (MemberInfo property in componentPersistentProperties)
+ {
+ MapComposedIdProperties(compoAsId, new PropertyPath(memberPath, property));
+ }
+ });
+ }
+
+ MemberInfo[] composedIdPropeties = persistentProperties.Where(mi => modelInspector.IsMemberOfComposedId(mi)).ToArray();
+ if (composedIdPropeties.Length > 0)
+ {
+ classMapper.ComposedId(composedIdMapper =>
+ {
+ foreach (MemberInfo property in composedIdPropeties)
+ {
+ MapComposedIdProperties(composedIdMapper, new PropertyPath(null, property));
+ }
+ });
+ }
+
+ MemberInfo[] naturalIdPropeties = persistentProperties.Except(composedIdPropeties).Where(mi => modelInspector.IsMemberOfNaturalId(mi)).ToArray();
if (naturalIdPropeties.Length > 0)
{
classMapper.NaturalId(naturalIdMapper =>
@@ -743,7 +778,7 @@
});
}
var splitGroups = modelInspector.GetPropertiesSplits(type);
- var propertiesToMap = persistentProperties.Where(mi => !modelInspector.IsVersion(mi) && !modelInspector.IsVersion(mi.GetMemberFromDeclaringType())).Except(naturalIdPropeties).ToList();
+ var propertiesToMap = persistentProperties.Except(naturalIdPropeties).Except(composedIdPropeties).Where(mi => !modelInspector.IsVersion(mi) && !modelInspector.IsVersion(mi.GetMemberFromDeclaringType())).ToList();
var propertiesInSplits = new HashSet<MemberInfo>();
foreach (var splitGroup in splitGroups)
{
@@ -838,6 +873,34 @@
}
}
+ private void MapComposedIdProperties(IMinimalPlainPropertyContainerMapper composedIdMapper, PropertyPath propertyPath)
+ {
+ MemberInfo member = propertyPath.LocalMember;
+ System.Type propertyType = member.GetPropertyOrFieldType();
+ var memberPath = propertyPath;
+ if (modelInspector.IsProperty(member))
+ {
+ MapProperty(member, memberPath, composedIdMapper);
+ }
+ else if (modelInspector.IsManyToOne(member))
+ {
+ MapManyToOne(member, memberPath, composedIdMapper);
+ }
+ else if (modelInspector.IsAny(member) || modelInspector.IsComponent(propertyType) ||
+ modelInspector.IsOneToOne(member) || modelInspector.IsSet(member)
+ || modelInspector.IsDictionary(member) || modelInspector.IsArray(member)
+ || modelInspector.IsList(member) || modelInspector.IsBag(member))
+ {
+ throw new ArgumentOutOfRangeException("propertyPath",
+ string.Format("The property {0} of {1} can't be part of composite-id.",
+ member.Name, member.DeclaringType));
+ }
+ else
+ {
+ MapProperty(member, memberPath, composedIdMapper);
+ }
+ }
+
private void MapNaturalIdProperties(System.Type rootEntityType, INaturalIdMapper naturalIdMapper, MemberInfo property)
{
MemberInfo member = property;
@@ -973,7 +1036,7 @@
});
}
- private void MapProperty(MemberInfo member, PropertyPath propertyPath, IBasePlainPropertyContainerMapper propertiesContainer)
+ private void MapProperty(MemberInfo member, PropertyPath propertyPath, IMinimalPlainPropertyContainerMapper propertiesContainer)
{
propertiesContainer.Property(member, propertyMapper =>
{
@@ -1165,7 +1228,7 @@
});
}
- private void MapManyToOne(MemberInfo member, PropertyPath propertyPath, IBasePlainPropertyContainerMapper propertiesContainer)
+ private void MapManyToOne(MemberInfo member, PropertyPath propertyPath, IMinimalPlainPropertyContainerMapper propertiesContainer)
{
propertiesContainer.ManyToOne(member, manyToOneMapper =>
{
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-27 14:36:13 UTC (rev 5774)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-27 18:54:47 UTC (rev 5775)
@@ -297,8 +297,11 @@
<Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" />
<Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" />
<Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" />
+ <Compile Include="Mapping\ByCode\Impl\ComponentAsIdLikeComponetAttributesMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\ComponentAsIdMapper.cs" />
<Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" />
+ <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\ComponentAsIdCustomizer.cs" />
+ <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\PropertyToField.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComponentAsIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -0,0 +1,157 @@
+using System.Linq;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ExpliticMappingTests
+{
+ public class ComponentAsIdTests
+ {
+ private class MyClass
+ {
+ private IMyCompo id;
+ public IMyCompo Id
+ {
+ get { return id; }
+ set { id = value; }
+ }
+ }
+
+ private interface IMyCompo
+ {
+ string Code { get; set; }
+ string Name { get; set; }
+ }
+ private class MyComponent : IMyCompo
+ {
+ public string Code { get; set; }
+ public string Name { get; set; }
+ }
+
+ [Test]
+ public void WhenPropertyUsedAsComposedIdThenRegister()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ var mapper = new ModelMapper(inspector);
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id));
+
+ inspector.IsPersistentId(For<MyClass>.Property(x => x.Id)).Should().Be.True();
+ inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Id)).Should().Be.True();
+ inspector.IsComponent(typeof(IMyCompo)).Should().Be.True();
+ }
+
+ [Test]
+ public void WhenMapComponentAsIdThenMapItAndItsProperties()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap =>
+ {
+ idmap.Property(y => y.Code);
+ idmap.Property(y => y.Name);
+ }));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>();
+ keyProperties.Should().Have.Count.EqualTo(2);
+ keyProperties.Select(x => x.Name).Should().Have.SameValuesAs("Code", "Name");
+ }
+
+ [Test]
+ public void WhenMapComponentAsIdAttributesThenMapAttributes()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap =>
+ {
+ idmap.Access(Accessor.Field);
+ idmap.Class<MyComponent>();
+ }));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ hbmCompositId.access.Should().Contain("field");
+ hbm...@cl...().Contain("MyComponent");
+ }
+
+ [Test]
+ public void WhenMapComponentUsedAsComponentAsIdThenMapItAndItsProperties()
+ {
+ var mapper = new ModelMapper();
+ mapper.Component<IMyCompo>(x =>
+ {
+ x.Property(y => y.Code, pm => pm.Length(10));
+ x.Property(y => y.Name);
+ });
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>();
+ keyProperties.Should().Have.Count.EqualTo(2);
+ keyProperties.Select(x => x.Name).Should().Have.SameValuesAs("Code", "Name");
+ keyProperties.Where(x => x.Name == "Code").Single().length.Should().Be("10");
+ }
+
+ [Test]
+ public void WhenMapCustomizedComponentUsedAsComponentAsIdWithCustomizationThenUseComponentAsIdCustomization()
+ {
+ var mapper = new ModelMapper();
+ mapper.Component<IMyCompo>(x =>
+ {
+ x.Property(y => y.Code, pm=> pm.Length(10));
+ x.Property(y => y.Name, pm => pm.Length(20));
+ });
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap =>
+ {
+ idmap.Property(y => y.Code, pm => pm.Length(15));
+ idmap.Property(y => y.Name, pm => pm.Length(25));
+ }));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ var keyProperties = hbmCompositId.Items.OfType<HbmKeyProperty>();
+ keyProperties.Select(x => x.length).Should().Have.SameValuesAs("15", "25");
+ }
+
+ [Test]
+ public void WhenMapAttributesOfCustomizedComponentUsedAsComponentAsIdWithCustomizationThenUseInComponentAsIdCustomization()
+ {
+ var mapper = new ModelMapper();
+ mapper.Component<IMyCompo>(x =>
+ {
+ x.Access(Accessor.Field);
+ x.Class<MyComponent>();
+ });
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ hbmCompositId.access.Should().Contain("field");
+ hbm...@cl...().Contain("MyComponent");
+ }
+
+ [Test]
+ public void WhenMapAttributesOfCustomizedComponentUsedAsComponentAsIdWithCustomizationOverrideThenUseComponentAsIdCustomization()
+ {
+ var mapper = new ModelMapper();
+ mapper.Component<IMyCompo>(x =>
+ {
+ x.Access(Accessor.Field);
+ x.Class<MyComponent>();
+ });
+ mapper.Class<MyClass>(map => map.ComponentAsId(x => x.Id, idmap => idmap.Access(Accessor.NoSetter)));
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ hbmCompositId.access.Should().Contain("nosetter");
+ hbm...@cl...().Contain("MyComponent");
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775)
@@ -0,0 +1,119 @@
+using System;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.MappingByCode.ExpliticMappingTests
+{
+ public class ComposedIdTests
+ {
+ private class MyClass
+ {
+ public int Code { get; set; }
+ private MyOther relation;
+ public MyOther Relation
+ {
+ get { return relation; }
+ set { relation = value; }
+ }
+ }
+
+ private class MyOther
+ {
+ public int Id { get; set; }
+ }
+
+ [Test]
+ public void WhenPropertyUsedAsComposedIdThenRegister()
+ {
+ var inspector = new ExplicitlyDeclaredModel();
+ var mapper = new ModelMapper(inspector);
+ mapper.Class<MyClass>(map =>
+ map.ComposedId(cm=>
+ {
+ cm.Property(x => x.Code);
+ cm.ManyToOne(x => x.Relation);
+ })
+ );
+
+ inspector.IsMemberOfComposedId(For<MyClass>.Property(x => x.Code)).Should().Be.True();
+ inspector.IsMemberOfComposedId(For<MyClass>.Property(x => x.Relation)).Should().Be.True();
+ inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Code)).Should().Be.True();
+ inspector.IsPersistentProperty(For<MyClass>.Property(x => x.Relation)).Should().Be.True();
+ inspector.IsPersistentId(For<MyClass>.Property(x => x.Code)).Should().Be.False();
+ inspector.IsPersistentId(For<MyClass>.Property(x => x.Relation)).Should().Be.False();
+ }
+
+ [Test]
+ public void WhenPropertyUsedAsComposedIdThenNotUsedAsSimpleProperties()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(map =>
+ map.ComposedId(cm =>
+ {
+ cm.Property(x => x.Code);
+ cm.ManyToOne(x => x.Relation);
+ })
+ );
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmCompositId = hbmClass.CompositeId;
+ hbmCompositId.Items.Should().Have.Count.EqualTo(2);
+ hbmClass.Properties.Should().Be.Empty();
+ }
+
+ [Test]
+ public void WhenPropertyUsedAsComposedIdAndPropertiesThenNotUsedAsSimpleProperties()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(map =>
+ {
+ map.ComposedId(cm =>
+ {
+ cm.Property(x => x.Code);
+ cm.ManyToOne(x => x.Relation);
+ });
+ map.Property(x => x.Code);
+ map.ManyToOne(x => x.Relation);
+ }
+ );
+ HbmMapping hbmMapping = mapper.CompileMappingFor(new[] {typeof (MyClass)});
+ HbmClass hbmClass = hbmMapping.RootClasses[0];
+ HbmCompositeId hbmCompositId =...
[truncated message content] |
|
From: <fab...@us...> - 2011-04-27 20:51:49
|
Revision: 5776
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5776&view=rev
Author: fabiomaulo
Date: 2011-04-27 20:51:43 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Minor fix (cleaned mapping when empty natural-id is defined)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 20:51:43 UTC (rev 5776)
@@ -196,9 +196,7 @@
{
if (naturalIdMapper == null)
{
- var hbmNaturalId = new HbmNaturalId();
- classMapping.naturalid = hbmNaturalId;
- naturalIdMapper = new NaturalIdMapper(Container, hbmNaturalId, MapDoc);
+ naturalIdMapper = new NaturalIdMapper(Container, classMapping, MapDoc);
}
naturalIdMapping(naturalIdMapper);
}
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs 2011-04-27 18:54:47 UTC (rev 5775)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/NaturalIdMapper.cs 2011-04-27 20:51:43 UTC (rev 5776)
@@ -6,11 +6,17 @@
{
public class NaturalIdMapper : AbstractBasePropertyContainerMapper, INaturalIdMapper
{
+ private readonly HbmClass classMapping;
private readonly HbmNaturalId naturalIdmapping;
- public NaturalIdMapper(System.Type rootClass, HbmNaturalId naturalIdmapping, HbmMapping mapDoc) : base(rootClass, mapDoc)
+ public NaturalIdMapper(System.Type rootClass, HbmClass classMapping, HbmMapping mapDoc) : base(rootClass, mapDoc)
{
- this.naturalIdmapping = naturalIdmapping;
+ if (classMapping == null)
+ {
+ throw new ArgumentNullException("classMapping");
+ }
+ this.classMapping = classMapping;
+ naturalIdmapping = new HbmNaturalId();
}
#region Overrides of AbstractBasePropertyContainerMapper
@@ -21,6 +27,10 @@
{
throw new ArgumentNullException("property");
}
+ if(classMapping.naturalid == null)
+ {
+ classMapping.naturalid = naturalIdmapping;
+ }
var toAdd = new[] {property};
naturalIdmapping.Items = naturalIdmapping.Items == null ? toAdd : naturalIdmapping.Items.Concat(toAdd).ToArray();
}
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/ComposedIdTests.cs 2011-04-27 20:51:43 UTC (rev 5776)
@@ -109,10 +109,7 @@
HbmClass hbmClass = hbmMapping.RootClasses[0];
HbmCompositeId hbmCompositId = hbmClass.CompositeId;
hbmCompositId.Items.Should().Have.Count.EqualTo(2);
- if(hbmClass.naturalid != null)
- {
- hbmClass.naturalid.Items.Should().Be.Null();
- }
+ hbmClass.naturalid.Should().Be.Null();
hbmClass.Properties.Should().Be.Empty();
}
}
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs 2011-04-27 18:54:47 UTC (rev 5775)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/NaturalIdTests.cs 2011-04-27 20:51:43 UTC (rev 5776)
@@ -27,7 +27,7 @@
}
[Test]
- public void WhenDefineRootEntityThenRegister()
+ public void WhenDefineNaturalIdThenRegister()
{
var inspector = new ExplicitlyDeclaredModel();
var mapper = new ModelMapper(inspector);
@@ -51,5 +51,19 @@
inspector.IsMemberOfNaturalId(For<MyClass>.Property(x => x.MyComponent)).Should().Be.True();
inspector.IsMemberOfNaturalId(For<MyClass>.Property(x => x.Any)).Should().Be.True();
}
+
+ [Test]
+ public void WhenDefineEmptyNaturalIdThenNoMapIt()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<MyClass>(map =>
+ {
+ map.Id(x => x.Id, idmap => { });
+ map.NaturalId(nidm =>{});
+ });
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(MyClass) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ hbmClass.naturalid.Should().Be.Null();
+ }
}
}
\ 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-27 21:49:18
|
Revision: 5777
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5777&view=rev
Author: fabiomaulo
Date: 2011-04-27 21:49:11 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Impl DynamicComponentCustomizer to set dynamic-component attributes
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs
trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs 2011-04-27 20:51:43 UTC (rev 5776)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IDynamicComponentAttributesMapper.cs 2011-04-27 21:49:11 UTC (rev 5777)
@@ -4,6 +4,7 @@
{
void Update(bool consideredInUpdateQuery);
void Insert(bool consideredInInsertQuery);
+ void Unique(bool unique);
}
public interface IDynamicComponentMapper : IDynamicComponentAttributesMapper, IPropertyContainerMapper { }
@@ -12,6 +13,7 @@
{
void Update(bool consideredInUpdateQuery);
void Insert(bool consideredInInsertQuery);
+ void Unique(bool unique);
}
public interface IDynamicComponentMapper<TComponent> : IDynamicComponentAttributesMapper<TComponent>, IPropertyContainerMapper<TComponent> where TComponent : class { }
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-27 20:51:43 UTC (rev 5776)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-27 21:49:11 UTC (rev 5777)
@@ -22,29 +22,34 @@
public void Access(Accessor accessor)
{
- throw new NotImplementedException();
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Access(accessor));
}
public void Access(System.Type accessorType)
{
- throw new NotImplementedException();
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Access(accessorType));
}
public void OptimisticLock(bool takeInConsiderationForOptimisticLock)
{
- throw new NotImplementedException();
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.OptimisticLock(takeInConsiderationForOptimisticLock));
}
public void Update(bool consideredInUpdateQuery)
{
- throw new NotImplementedException();
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Update(consideredInUpdateQuery));
}
public void Insert(bool consideredInInsertQuery)
{
- throw new NotImplementedException();
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Insert(consideredInInsertQuery));
}
+ public void Unique(bool unique)
+ {
+ CustomizersHolder.AddCustomizer(PropertyPath, (IDynamicComponentAttributesMapper m) => m.Unique(unique));
+ }
+
#endregion
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-27 20:51:43 UTC (rev 5776)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-27 21:49:11 UTC (rev 5777)
@@ -163,5 +163,10 @@
{
component.insert = consideredInInsertQuery;
}
+
+ public void Unique(bool unique)
+ {
+ component.unique = unique;
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-27 20:51:43 UTC (rev 5776)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-27 21:49:11 UTC (rev 5777)
@@ -13,7 +13,12 @@
private class Person
{
public int Id { get; set; }
- public IDictionary Info { get; set; }
+ private IDictionary info;
+ public IDictionary Info
+ {
+ get { return info; }
+ set { info = value; }
+ }
}
[Test]
@@ -48,5 +53,32 @@
var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().Single();
hbmDynamicComponent.Properties.OfType<HbmProperty>().Select(x => x.type1).All(x=> x.Satisfy(value=> !string.IsNullOrEmpty(value)));
}
+
+ [Test]
+ public void WhenMapDynCompoAttributesThenMapAttributes()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class<Person>(map =>
+ {
+ map.Id(x => x.Id, idmap => { });
+ map.Component(x => x.Info, new { MyInt = 5}, z =>
+ {
+ z.Access(Accessor.Field);
+ z.Insert(false);
+ z.Update(false);
+ z.Unique(true);
+ z.OptimisticLock(false);
+ });
+ });
+
+ var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) });
+ var hbmClass = hbmMapping.RootClasses[0];
+ var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().SingleOrDefault();
+ hbmDynamicComponent.access.Should().Contain("field");
+ hbmDynamicComponent.insert.Should().Be.False();
+ hbmDynamicComponent.update.Should().Be.False();
+ hbmDynamicComponent.optimisticlock.Should().Be.False();
+ hbmDynamicComponent.unique.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.
|
|
From: <fab...@us...> - 2011-04-27 21:53:37
|
Revision: 5778
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5778&view=rev
Author: fabiomaulo
Date: 2011-04-27 21:53:31 +0000 (Wed, 27 Apr 2011)
Log Message:
-----------
Merge of Dynamic-compo customizers
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:49:11 UTC (rev 5777)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-27 21:53:31 UTC (rev 5778)
@@ -353,6 +353,7 @@
MergeDictionary(collectionRelationOneToManyCustomizers, source.collectionRelationOneToManyCustomizers);
MergeDictionary(mapKeyManyToManyCustomizers, source.mapKeyManyToManyCustomizers);
MergeDictionary(mapKeyElementCustomizers, source.mapKeyElementCustomizers);
+ MergeDictionary(dynamicComponentCustomizers, source.dynamicComponentCustomizers);
}
#endregion
Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:49:11 UTC (rev 5777)
+++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/CustomizerHolderMergeTest.cs 2011-04-27 21:53:31 UTC (rev 5778)
@@ -328,5 +328,20 @@
called.Should().Be.True();
}
+
+ [Test]
+ public void MergeShouldMergeDynamicComponentAttributesMapper()
+ {
+ var emptyHolder = new CustomizersHolder();
+ var holder = new CustomizersHolder();
+ var called = false;
+
+ holder.AddCustomizer(propertyPath, (IDynamicComponentAttributesMapper x) => called = true);
+ emptyHolder.Merge(holder);
+ emptyHolder.InvokeCustomizers(propertyPath, (IDynamicComponentAttributesMapper)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.
|
|
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.
|
|
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-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 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-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-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 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...
[truncated message content] |
|
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 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-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-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 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-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-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)
- {
- persistentMe...
[truncated message content] |
|
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-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 22:19:25
|
Revision: 5805
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5805&view=rev
Author: fabiomaulo
Date: 2011-05-09 22:19:18 +0000 (Mon, 09 May 2011)
Log Message:
-----------
Passing test for NH-2100
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs
Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-05-09 21:20:24 UTC (rev 5804)
+++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ConventionModelMapper.cs 2011-05-09 22:19:18 UTC (rev 5805)
@@ -29,14 +29,19 @@
BeforeMapComponent += ComponentParentNoSetterToField;
BeforeMapBag += MemberToFieldAccessor;
+ BeforeMapIdBag += MemberToFieldAccessor;
BeforeMapSet += MemberToFieldAccessor;
BeforeMapMap += MemberToFieldAccessor;
BeforeMapList += MemberToFieldAccessor;
+
BeforeMapBag += MemberNoSetterToField;
+ BeforeMapIdBag += MemberNoSetterToField;
BeforeMapSet += MemberNoSetterToField;
BeforeMapMap += MemberNoSetterToField;
BeforeMapList += MemberNoSetterToField;
+
BeforeMapBag += MemberReadOnlyAccessor;
+ BeforeMapIdBag += MemberReadOnlyAccessor;
BeforeMapSet += MemberReadOnlyAccessor;
BeforeMapMap += MemberReadOnlyAccessor;
BeforeMapList += MemberReadOnlyAccessor;
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Domain.cs 2011-05-09 22:19:18 UTC (rev 5805)
@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+namespace NHibernate.Test.NHSpecificTest.NH2100
+{
+ public abstract class DomainObject
+ {
+ public virtual int ID { get; set; }
+ public virtual int EntityVersion { get; set; }
+ }
+
+ public class Class1 : DomainObject
+ {
+ private readonly IList<Class2> _class2List = new List<Class2>();
+
+ public virtual void AddClass2(Class2 toAdd)
+ {
+ if (false == _class2List.Contains(toAdd))
+ {
+ _class2List.Add(toAdd);
+ toAdd.AddClass1(this);
+ }
+ }
+
+ public virtual ReadOnlyCollection<Class2> Class2List
+ {
+ get { return new ReadOnlyCollection<Class2>(_class2List); }
+ }
+ }
+
+ public class Class1DTO : DTO
+ {
+ public Class2DTO[] Class2Ary { get; set; }
+ }
+
+ /// <summary>
+ /// RG
+ /// </summary>
+ public class Class2 : DomainObject
+ {
+ private readonly IList<Class1> _class1List = new List<Class1>();
+
+ public virtual void AddClass1(Class1 toAdd)
+ {
+ if (false == _class1List.Contains(toAdd))
+ {
+ _class1List.Add(toAdd);
+ toAdd.AddClass2(this);
+ }
+ }
+ }
+
+ public class Class2DTO : DTO { }
+
+ public abstract class DTO
+ {
+ public int ID;
+ public int EntityVersion;
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2100/Fixture.cs 2011-05-09 22:19:18 UTC (rev 5805)
@@ -0,0 +1,121 @@
+using System;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2100
+{
+ public class Fixture : TestCaseMappingByCode
+ {
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ConventionModelMapper();
+ System.Type baseEntityType = typeof (DomainObject);
+ mapper.IsEntity((t, declared) => baseEntityType.IsAssignableFrom(t) && !baseEntityType.Equals(t));
+ mapper.IsRootEntity((t, declared) => baseEntityType.Equals(t.BaseType));
+ mapper.Class<DomainObject>(r =>
+ {
+ r.Version(x => x.EntityVersion, map => { });
+ r.Id(x => x.ID, map => map.Generator(Generators.Native));
+ });
+ mapper.Class<Class1>(r => { r.IdBag(x => x.Class2List, map => map.Inverse(true), rel => rel.ManyToMany()); });
+ mapper.Class<Class2>(r => { r.IdBag<Class1>("_class1List", map => { }, rel => rel.ManyToMany()); });
+ HbmMapping mappings = mapper.CompileMappingFor(new[] {typeof (Class1), typeof (Class2)});
+ Console.WriteLine(mappings.AsString());
+ return mappings;
+ }
+
+ [Test]
+ public void WhenTwoTransactionInSameSessionThenNotChangeVersion()
+ {
+ // the second transaction does not change the entity state
+ Class1 c1_1;
+ Class1 c1_2;
+ Class2 c2_1;
+ Class2 c2_2;
+ int originalVersionC1_1;
+ int originalVersionC1_2;
+ int originalVersionC2_1;
+ int originalVersionC2_2;
+ c1_1 = new Class1();
+ c1_2 = new Class1();
+
+ c2_1 = new Class2();
+ c2_2 = new Class2();
+
+ c1_1.AddClass2(c2_1);
+ c1_2.AddClass2(c2_2);
+ using (ISession s = OpenSession())
+ {
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.Save(c2_1);
+ s.Save(c1_1);
+ s.Save(c2_2);
+ s.Save(c1_2);
+ tx.Commit();
+ }
+ originalVersionC1_1 = c1_1.EntityVersion;
+ originalVersionC1_2 = c1_2.EntityVersion;
+ originalVersionC2_1 = c2_1.EntityVersion;
+ originalVersionC2_2 = c2_2.EntityVersion;
+
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.Refresh(c1_1); // The addition of these two Refresh calls fixes the entity version issue
+ s.Refresh(c1_2);
+
+ var class1dto =
+ new Class1DTO {ID = c1_1.ID, EntityVersion = c1_1.EntityVersion};
+
+ if (c1_1.Class2List.Count > 0)
+ {
+ class1dto.Class2Ary = new Class2DTO[c1_1.Class2List.Count];
+ for (int i = 0; i < c1_1.Class2List.Count; ++i)
+ {
+ Class2 cl2 = c1_1.Class2List[i];
+ class1dto.Class2Ary[i] = new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion};
+ }
+ }
+
+ tx.Commit();
+ }
+ // After close the second transaction the version was not changed
+ c1_1.EntityVersion.Should().Be(originalVersionC1_1);
+ c1_2.EntityVersion.Should().Be(originalVersionC1_2);
+ c2_1.EntityVersion.Should().Be(originalVersionC2_1);
+ c2_2.EntityVersion.Should().Be(originalVersionC2_2);
+ }
+
+ // After close the session the version was not changed
+ c1_1.EntityVersion.Should().Be(originalVersionC1_1);
+ c1_2.EntityVersion.Should().Be(originalVersionC1_2);
+ c2_1.EntityVersion.Should().Be(originalVersionC2_1);
+ c2_2.EntityVersion.Should().Be(originalVersionC2_2);
+
+ using (ISession s = OpenSession())
+ {
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ c2_1 = s.Get<Class2>(c2_1.ID);
+ c1_1 = s.Get<Class1>(c1_1.ID);
+ c2_2 = s.Get<Class2>(c2_2.ID);
+ c1_2 = s.Get<Class1>(c1_2.ID);
+
+ // to be 100% sure the version was not changed in DB
+ c1_1.EntityVersion.Should().Be(originalVersionC1_1);
+ c1_2.EntityVersion.Should().Be(originalVersionC1_2);
+ c2_1.EntityVersion.Should().Be(originalVersionC2_1);
+ c2_2.EntityVersion.Should().Be(originalVersionC2_2);
+
+ s.Delete(c2_1);
+ s.Delete(c1_1);
+ s.Delete(c2_2);
+ s.Delete(c1_2);
+ 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-05-09 21:20:24 UTC (rev 5804)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 22:19:18 UTC (rev 5805)
@@ -662,6 +662,8 @@
<Compile Include="NHSpecificTest\NH2043\Domain.cs" />
<Compile Include="NHSpecificTest\NH2043\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2056\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2100\Domain.cs" />
+ <Compile Include="NHSpecificTest\NH2100\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2111\A.cs" />
<Compile Include="NHSpecificTest\NH2111\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2112\Fixture.cs" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-10 16:57:31
|
Revision: 5807
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5807&view=rev
Author: fabiomaulo
Date: 2011-05-10 16:57:24 +0000 (Tue, 10 May 2011)
Log Message:
-----------
Fix NH-2697
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs
trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs
trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs
Modified: trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-09 22:21:23 UTC (rev 5806)
+++ trunk/nhibernate/src/NHibernate/Engine/ISessionFactoryImplementor.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -86,9 +86,9 @@
/// <summary>
/// Get the names of all persistent classes that implement/extend the given interface/class
/// </summary>
- /// <param name="className"></param>
- /// <returns></returns>
- string[] GetImplementors(string className);
+ /// <param name="entityOrClassName">The entity-name, the class name or full name, the imported class name.</param>
+ /// <returns>All implementors class names.</returns>
+ string[] GetImplementors(string entityOrClassName);
/// <summary>
/// Get a class name, using query language imports
Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-09 22:21:23 UTC (rev 5806)
+++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/PolymorphicQuerySourceDetector.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -20,34 +20,31 @@
_sessionFactoryHelper = new SessionFactoryHelper(sfi);
}
- public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree)
- {
- foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources())
- {
- var className = GetClassName(querySource);
- var classType = _sessionFactoryHelper.GetImportedClass(className);
+ public Dictionary<IASTNode, IASTNode[]> Process(IASTNode tree)
+ {
+ foreach (var querySource in new QuerySourceDetector(tree).LocateQuerySources())
+ {
+ var className = GetClassName(querySource);
+ string[] implementors = _sfi.GetImplementors(className);
+ AddImplementorsToMap(querySource, className, implementors);
+ }
- AddImplementorsToMap(querySource, classType == null ? className : classType.FullName);
- }
+ return _map;
+ }
- return _map;
- }
+ private void AddImplementorsToMap(IASTNode querySource, string className, string[] implementors)
+ {
+ if (implementors.Length == 1 && implementors[0] == className)
+ {
+ // No need to change things
+ return;
+ }
- private void AddImplementorsToMap(IASTNode querySource, string className)
- {
- var implementors = _sfi.GetImplementors(className);
+ _map.Add(querySource,
+ implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray());
+ }
- if (implementors.Length == 1 && implementors[0] == className)
- {
- // No need to change things
- return;
- }
-
- _map.Add(querySource,
- implementors.Select(implementor => MakeIdent(querySource, implementor)).ToArray());
- }
-
- private static string GetClassName(IASTNode querySource)
+ private static string GetClassName(IASTNode querySource)
{
switch (querySource.Type)
{
Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-09 22:21:23 UTC (rev 5806)
+++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -588,22 +588,22 @@
/// given class or interface, accounting for implicit/explicit polymorphism settings
/// and excluding mapped subclasses/joined-subclasses of other classes in the result.
/// </summary>
- public string[] GetImplementors(string className)
+ public string[] GetImplementors(string entityOrClassName)
{
System.Type clazz = null;
// NH Different implementation for performance: a class without at least a namespace sure can't be found by reflection
- if (className.IndexOf('.') > 0)
+ if (entityOrClassName.IndexOf('.') > 0)
{
IEntityPersister checkPersister;
// NH Different implementation: we have better performance checking, first of all, if we know the class
// and take the System.Type directly from the persister (className have high probability to be entityName)
- if (entityPersisters.TryGetValue(className, out checkPersister))
+ if (entityPersisters.TryGetValue(entityOrClassName, out checkPersister))
{
if(!checkPersister.EntityMetamodel.HasPocoRepresentation)
{
// we found the persister but it is a dynamic entity without class
- return new[] { className };
+ return new[] { entityOrClassName };
}
// NH : take care with this because we are forcing the Poco EntityMode
clazz = checkPersister.GetMappedClass(EntityMode.Poco);
@@ -613,7 +613,7 @@
{
try
{
- clazz = ReflectHelper.ClassForFullNameOrNull(className);
+ clazz = ReflectHelper.ClassForFullNameOrNull(entityOrClassName);
}
catch (Exception)
{
@@ -624,29 +624,40 @@
if (clazz == null)
{
- return new[] {className}; //for a dynamic-class
+ // try to get the class from imported names
+ string importedName = GetImportedClassName(entityOrClassName);
+ if (importedName != null)
+ {
+ clazz = System.Type.GetType(importedName, false);
+ }
}
+ if (clazz == null)
+ {
+ return new[] {entityOrClassName}; //for a dynamic-class
+ }
+
List<string> results = new List<string>();
foreach (IEntityPersister p in entityPersisters.Values)
{
IQueryable q = p as IQueryable;
if (q != null)
{
- string testClassName = q.EntityName;
- bool isMappedClass = className.Equals(testClassName);
+ string registeredEntityName = q.EntityName;
+ // NH: as entity-name we are using the FullName but in HQL we allow just the Name, the class is mapped even when its FullName match the entity-name
+ bool isMappedClass = entityOrClassName.Equals(registeredEntityName) || clazz.FullName.Equals(registeredEntityName);
if (q.IsExplicitPolymorphism)
{
if (isMappedClass)
{
- return new string[] {testClassName}; // NOTE EARLY EXIT
+ return new string[] {registeredEntityName}; // NOTE EARLY EXIT
}
}
else
{
if (isMappedClass)
{
- results.Add(testClassName);
+ results.Add(registeredEntityName);
}
else
{
@@ -665,7 +676,7 @@
}
if (!assignableSuperclass)
{
- results.Add(testClassName);
+ results.Add(registeredEntityName);
}
}
}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleGroupItem.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace NHibernate.Test.NHSpecificTest.NH2697
+{
+ public class ArticleGroupItem
+ {
+ public virtual int Articlegroupid { get; set; }
+ public virtual string Name { get; set; }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/ArticleItem.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -0,0 +1,15 @@
+
+
+using System;
+namespace NHibernate.Test.NHSpecificTest.NH2697
+
+{
+ public class ArticleItem
+ {
+ public virtual int Articleid { get; set; }
+ public virtual Int16 IsFavorite { get; set; }
+ public virtual string Name { get; set; }
+ public virtual ArticleGroupItem Articlegroup { get; set; }
+
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/Mappings.hbm.xml 2011-05-10 16:57:24 UTC (rev 5807)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.NHSpecificTest.NH2697">
+
+ <class name="ArticleItem" table="ARTICLES" lazy="true" dynamic-update="true"
+ entity-name="Article" polymorphism="explicit">
+ <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0">
+ <generator class="native" >
+ <param name="sequence">gen_articles_id</param>
+ </generator>
+ </id>
+ <property name="IsFavorite" column="ISFAVORITE" type="short" not-null="true"/>
+ <many-to-one name="Articlegroup" column="ARTICLEGROUPID" class="ArticleGroupItem" cascade="none" not-null="false"/>
+ <property name="Name" column="NAME" type="string" length="200" not-null="false"/>
+ </class>
+
+ <class name="ArticleItem" table="ACTIVITY_ARTICLES" lazy="true" dynamic-update="true"
+ entity-name="ActivityArticle" polymorphism="explicit">
+ <id name="Articleid" column="ARTICLEID" type="int" unsaved-value="0">
+ <generator class="native" >
+ <param name="sequence">gen_articles_id</param>
+ </generator>
+ </id>
+ <property name="Name" column="NAME" type="string" length="200" not-null="false"/>
+ </class>
+
+ <class name="ArticleGroupItem" table="ARTICLEGROUPS" lazy="true" dynamic-update="true">
+ <id name="Articlegroupid" column="ARTICLEGROUPID" type="int" unsaved-value="0">
+ <generator class="native" >
+ <param name="sequence">gen_pk_ArticleGroups</param>
+ </generator>
+ </id>
+ <property name="Name" column="NAME" type="string" length="200" not-null="false"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2697/SampleTest.cs 2011-05-10 16:57:24 UTC (rev 5807)
@@ -0,0 +1,149 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using NHibernate.Dialect;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2697
+{
+ [TestFixture]
+ public class SampleTest : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ base.OnSetUp();
+ using (ISession session = this.OpenSession()) {
+ ArticleGroupItem agrp_1 = new ArticleGroupItem();
+ agrp_1.Name = "Article group 1";
+ session.Save(agrp_1);
+ ArticleGroupItem agrp_2 = new ArticleGroupItem();
+ agrp_2.Name = "Article group 2";
+ session.Save(agrp_2);
+ session.Flush();
+
+ ArticleItem article_1 = new ArticleItem();
+ article_1.Articlegroup = agrp_1;
+ article_1.Name = "Article 1 grp 1";
+ article_1.IsFavorite = 0;
+ session.Save("Article", article_1);
+
+ ArticleItem article_2 = new ArticleItem();
+ article_2.Articlegroup = agrp_1;
+ article_2.Name = "Article 2 grp 1";
+ article_2.IsFavorite = 1;
+ session.Save("Article", article_2);
+
+ ArticleItem article_3 = new ArticleItem();
+ article_3.Articlegroup = agrp_2;
+ article_3.Name = "Article 1 grp 2";
+ article_3.IsFavorite = 0;
+ session.Save("Article", article_3);
+
+ session.Flush();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ base.OnTearDown();
+
+
+ using (ISession session = this.OpenSession()) {
+ IList<ArticleItem> list = session.CreateCriteria("Article").List<ArticleItem>();
+ foreach (ArticleItem item in list)
+ session.Delete("Article", item);
+ session.Flush();
+ }
+
+ //Articles where not removed (!?)
+ //using (ISession session = this.OpenSession()) {
+ // string hql = "from Article";
+ // session.Delete(hql);
+ // session.Flush();
+ //}
+
+ using (ISession session = this.OpenSession()) {
+ string hql = "from ArticleGroupItem";
+ session.Delete(hql);
+ session.Flush();
+ }
+
+ }
+
+ [Test]
+ public void Can_GetListOfArticleGroups()
+ {
+ string HQL;
+ IList<ArticleGroupItem> result;
+
+ //add new
+ using (ISession session = this.OpenSession()) {
+ ArticleGroupItem item = new ArticleGroupItem();
+ item.Name = "Test article group";
+ session.Save(item);
+ session.Flush();
+ }
+
+ HQL = "from ArticleGroupItem";
+ using (ISession session = this.OpenSession()) {
+ result = session.CreateQuery(HQL).List<ArticleGroupItem>();
+ }
+ result.Count.Should().Be.GreaterThan(0);
+ }
+
+ [Test]
+ public void Can_GetListOfArticles()
+ {
+ string HQL;
+ IList<ArticleItem> result;
+
+ //add new
+ using (ISession session = this.OpenSession()) {
+ ArticleItem item = new ArticleItem();
+ item.Name = "Test article";
+ item.IsFavorite = 0;
+ session.Save("Article", item);
+ session.Flush();
+ }
+
+ //here first problem, no entities are returned <========
+ HQL = "from Article";
+ using (ISession session = this.OpenSession()) {
+ result = session.CreateQuery(HQL).List<ArticleItem>();
+ }
+ result.Count.Should().Be.GreaterThan(0);
+ }
+
+
+
+ [Test]
+ public void Can_SetArticleFavoriteWithHQL_NamedParam()
+ {
+ string HQL;
+ IList<ArticleItem> result;
+
+ Int16 isFavValue = 1;
+
+ //set isFavorite for all articles
+ HQL = "update Article a set a.IsFavorite= :Fav";
+ using (ISession session = this.OpenSession()) {
+ session.CreateQuery(HQL)
+ .SetInt16("Fav", isFavValue) //Exception !!
+ //.SetParameter("Fav", isFavValue) //Exception also !!
+ .ExecuteUpdate();
+
+ session.Flush();
+ }
+
+ //Check if some articles have isFavorite=1
+ HQL = "from Article a where a.IsFavorite=1";
+ using (ISession session = this.OpenSession()) {
+ result = session.CreateQuery(HQL).List<ArticleItem>();
+ }
+ result.Count.Should().Be.GreaterThan(0);
+
+ }
+ }
+}
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-09 22:21:23 UTC (rev 5806)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-10 16:57:24 UTC (rev 5807)
@@ -819,6 +819,9 @@
<Compile Include="NHSpecificTest\NH2660And2661\Test.cs" />
<Compile Include="NHSpecificTest\NH2673\Blog.cs" />
<Compile Include="NHSpecificTest\NH2673\CachingWithTrasformerTests.cs" />
+ <Compile Include="NHSpecificTest\NH2697\ArticleGroupItem.cs" />
+ <Compile Include="NHSpecificTest\NH2697\ArticleItem.cs" />
+ <Compile Include="NHSpecificTest\NH2697\SampleTest.cs" />
<Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" />
<Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" />
<Compile Include="NHSpecificTest\Properties\Model.cs" />
@@ -2661,6 +2664,7 @@
<EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <EmbeddedResource Include="NHSpecificTest\NH2697\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH1642\Mappings.hbm.xml" />
<EmbeddedResource Include="Stateless\Contact.hbm.xml" />
<EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-10 23:09:46
|
Revision: 5810
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5810&view=rev
Author: fabiomaulo
Date: 2011-05-10 23:09:40 +0000 (Tue, 10 May 2011)
Log Message:
-----------
The problem with ProxyCache seems fixed
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs
Modified: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs 2011-05-10 18:21:57 UTC (rev 5809)
+++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/ProxyCache.cs 2011-05-10 23:09:40 UTC (rev 5810)
@@ -8,12 +8,13 @@
using System;
using System.Collections.Generic;
+using NHibernate.Util;
namespace NHibernate.Proxy.DynamicProxy
{
public class ProxyCache : IProxyCache
{
- private readonly Dictionary<ProxyCacheEntry, System.Type> cache = new Dictionary<ProxyCacheEntry, System.Type>();
+ private readonly IDictionary<ProxyCacheEntry, System.Type> cache = new ThreadSafeDictionary<ProxyCacheEntry, System.Type>(new Dictionary<ProxyCacheEntry, System.Type>());
private readonly object syncObject = new object();
#region IProxyCache Members
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs 2011-05-10 18:21:57 UTC (rev 5809)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1789/ProxyEqualityProblemTest.cs 2011-05-10 23:09:40 UTC (rev 5810)
@@ -96,7 +96,7 @@
/// <summary>
/// That's how I discovered something was wrong: here my object is not found in the collection, even if it's there.
/// </summary>
- [Test, Ignore("To investigate. When run with the whole tests suit it fail...probably something related with the ProxyCache.")]
+ [Test]//, Ignore("To investigate. When run with the whole tests suit it fail...probably something related with the ProxyCache.")]
public void TestTheProblemWithCollection()
{
using (ISession session = OpenSession())
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <fab...@us...> - 2011-05-12 16:27:17
|
Revision: 5811
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5811&view=rev
Author: fabiomaulo
Date: 2011-05-12 16:27:11 +0000 (Thu, 12 May 2011)
Log Message:
-----------
Fix NH-2690 NH-2421 NH-2422 thanks to Andrei Alecu
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs
trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-10 23:09:40 UTC (rev 5810)
+++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-05-12 16:27:11 UTC (rev 5811)
@@ -515,7 +515,7 @@
ITranslator translator = Translators[i];
QueryParameters parameter = Parameters[i];
IList tempResults;
- if (resultCollectionGenericType[i] == typeof(object))
+ if (resultCollectionGenericType[i] == typeof(object) || parameter.ResultTransformer != null)
{
tempResults = new ArrayList();
}
Modified: trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-10 23:09:40 UTC (rev 5810)
+++ trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2011-05-12 16:27:11 UTC (rev 5811)
@@ -4,6 +4,7 @@
using System.Linq.Expressions;
using NHibernate.Engine;
using NHibernate.Impl;
+using Remotion.Linq;
namespace NHibernate.Linq
{
@@ -48,20 +49,20 @@
public static IEnumerable<T> ToFuture<T>(this IQueryable<T> query)
{
- var nhQueryable = query as NhQueryable<T>;
+ var nhQueryable = query as QueryableBase<T>;
if (nhQueryable == null)
- throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable");
+ throw new NotSupportedException("Query needs to be of type QueryableBase<T>");
- var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression);
+ var future = ((INhQueryProvider) nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression);
return (IEnumerable<T>)future;
}
public static IFutureValue<T> ToFutureValue<T>(this IQueryable<T> query)
{
- var nhQueryable = query as NhQueryable<T>;
+ var nhQueryable = query as QueryableBase<T>;
if (nhQueryable == null)
- throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable");
+ throw new NotSupportedException("Query needs to be of type QueryableBase<T>");
var future = ((INhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression);
if(future is DelayedEnumerator<T>)
Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-10 23:09:40 UTC (rev 5810)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2011-05-12 16:27:11 UTC (rev 5811)
@@ -75,6 +75,83 @@
}
[Test]
+ public void CanUseFutureQueryWithAnonymousType()
+ {
+ using (var s = sessions.OpenSession())
+ {
+ IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
+
+ var persons = s.Query<Person>()
+ .Select(p => new {Id = p.Id, Name = p.Name})
+ .ToFuture();
+ var persons5 = s.Query<Person>()
+ .Select(p => new { Id = p.Id, Name = p.Name })
+ .Take(5)
+ .ToFuture();
+
+ using (var logSpy = new SqlLogSpy())
+ {
+ persons5.ToList(); // initialize the enumerable
+ persons.ToList();
+
+ var events = logSpy.Appender.GetEvents();
+ Assert.AreEqual(1, events.Length);
+ }
+ }
+ }
+
+
+
+ [Test]
+ public void CanUseFutureFetchQuery()
+ {
+ using (var s = sessions.OpenSession())
+ using (var tx = s.BeginTransaction())
+ {
+ var p1 = new Person {Name = "Parent"};
+ var p2 = new Person {Parent = p1, Name = "Child"};
+ p1.Children.Add(p2);
+ s.Save(p1);
+ s.Save(p2);
+ tx.Commit();
+
+ s.Clear(); // we don't want caching
+ }
+
+ using (var s = sessions.OpenSession())
+ {
+ IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
+
+ var persons = s.Query<Person>()
+ .FetchMany(p => p.Children)
+ .ToFuture();
+ var persons10 = s.Query<Person>()
+ .FetchMany(p => p.Children)
+ .Take(10)
+ .ToFuture();
+
+
+ using (var logSpy = new SqlLogSpy())
+ {
+
+ Assert.That(persons.Any(x => x.Children.Any()), "No children found");
+ Assert.That(persons10.Any(x => x.Children.Any()), "No children found");
+
+ var events = logSpy.Appender.GetEvents();
+ Assert.AreEqual(1, events.Length);
+ }
+ }
+
+ using (ISession s = OpenSession())
+ using (ITransaction tx = s.BeginTransaction())
+ {
+ s.Delete("from Person");
+ tx.Commit();
+ }
+ }
+
+
+ [Test]
public void TwoFuturesRunInTwoRoundTrips()
{
using (var s = sessions.OpenSession())
Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-10 23:09:40 UTC (rev 5810)
+++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2011-05-12 16:27:11 UTC (rev 5811)
@@ -503,6 +503,48 @@
}
}
+ [Test]
+ public void CanGetResultsInAGenericListClass()
+ {
+ using (ISession s = OpenSession())
+ using (var tx = s.BeginTransaction())
+ {
+ var item1 = new Item() { Id = 1, Name = "test item"};
+ var item2 = new Item() { Id = 2, Name = "test child", Parent = item1 };
+ s.Save(item1);
+ s.Save(item2);
+
+ tx.Commit();
+ s.Clear();
+ }
+
+
+ using (ISession s = OpenSession())
+ {
+
+
+ IQuery getItems = s.CreateQuery("from Item");
+ IQuery parents = s.CreateQuery("select Parent from Item");
+
+ IList results = s.CreateMultiQuery()
+ .Add(getItems)
+ .Add<Item>(parents)
+ .List();
+
+ Assert.That(results[0], Is.InstanceOf<ArrayList>());
+ Assert.That(results[1], Is.InstanceOf<List<Item>>());
+ }
+
+ using (ISession s = OpenSession())
+ using (var tx = s.BeginTransaction())
+ {
+ s.Delete("from Item");
+ tx.Commit();
+ }
+ }
+
+
+
public class ResultTransformerStub : IResultTransformer
{
private bool _wasTransformTupleCalled;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|