From: <fab...@us...> - 2011-04-20 21:59:30
|
Revision: 5730 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5730&view=rev Author: fabiomaulo Date: 2011-04-20 21:59:24 +0000 (Wed, 20 Apr 2011) Log Message: ----------- Entities and Component mappers supporting dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:46:13 UTC (rev 5729) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-20 21:59:24 UTC (rev 5730) @@ -68,7 +68,9 @@ { throw new ArgumentOutOfRangeException("property", "Can't add a property of another graph"); } - throw new NotImplementedException(); + var hbm = new HbmDynamicComponent { name = property.Name }; + mapping(new DynamicComponentMapper(hbm, property, MapDoc)); + AddProperty(hbm); } public virtual void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:46:13 UTC (rev 5729) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AbstractPropertyContainerMapperTest.cs 2011-04-20 21:59:24 UTC (rev 5730) @@ -1,7 +1,9 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; using NHibernate.Mapping.ByCode.Impl; using NUnit.Framework; using SharpTestsEx; @@ -31,6 +33,10 @@ { public IDictionary<string, string> Dictionary { get; set; } } + private class MyClassWithDynamic + { + public IDictionary DynCompo { get; set; } + } [Test] public void CantCreateWithoutHbmMapping() @@ -111,6 +117,25 @@ elementRelationCalled.Should().Be.True(); } + [Test] + public void AddDynamicComponentProperty() + { + var properties = new List<object>(); + var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties); + map.Component(For<MyClassWithDynamic>.Property(x => x.DynCompo), (IDynamicComponentMapper cp) => { }); + properties.Single().Should().Be.OfType<HbmDynamicComponent>().And.ValueOf.Name.Should().Be.EqualTo("DynCompo"); + } + + [Test] + public void CallDynamicComponentMapper() + { + var properties = new List<object>(); + var map = new StubPropertyContainerMapper<MyClassWithDynamic>(properties); + var called = false; + map.Component(For<MyClassWithDynamic>.Property(x=> x.DynCompo), (IDynamicComponentMapper cp) => called = true); + called.Should().Be.True(); + } + private class HackPropertyContainerMapper : AbstractPropertyContainerMapper { public HackPropertyContainerMapper(System.Type container, HbmMapping mapDoc) : base(container, mapDoc) {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 14:14:33
|
Revision: 5736 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5736&view=rev Author: fabiomaulo Date: 2011-04-22 14:14:26 +0000 (Fri, 22 Apr 2011) Log Message: ----------- dynamic-component mapping first try Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ExplicitlyDeclaredModel.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -21,6 +21,8 @@ private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); + private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); @@ -135,6 +137,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -404,6 +411,13 @@ splitDefinitions.Add(definition); } + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + persistentMembers.Add(member); + dynamicComponents.Add(member); + dynamicComponentTemplates[member] = componentTemplate; + } + private void AddTypeSplits(System.Type propertyContainer, string splitGroupId) { HashSet<string> splitsGroupsIds; @@ -538,6 +552,18 @@ return properties.Contains(member); } + public bool IsDynamicComponent(MemberInfo member) + { + return dynamicComponents.Contains(member); + } + + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + System.Type template; + dynamicComponentTemplates.TryGetValue(member, out template); + return template ?? typeof(object); + } + public IEnumerable<string> GetPropertiesSplits(System.Type type) { return GetSplitGroupsFor(type); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/FakeModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -21,6 +21,7 @@ private readonly IEnumerable<MemberInfo> oneToOneRelations = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> poids = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> properties = Enumerable.Empty<MemberInfo>(); + private readonly IEnumerable<MemberInfo> dynamicComponents = Enumerable.Empty<MemberInfo>(); private readonly IEnumerable<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly IEnumerable<System.Type> rootEntities = Enumerable.Empty<System.Type>(); private readonly IEnumerable<MemberInfo> sets = Enumerable.Empty<MemberInfo>(); @@ -138,6 +139,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -158,6 +164,11 @@ return null; } + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + return typeof(object); + } + public void AddAsRootEntity(System.Type type) {} public void AddAsComponent(System.Type type) {} @@ -201,7 +212,7 @@ public void AddAsProperty(MemberInfo member) {} public void AddAsPersistentMember(MemberInfo member){} public void AddAsPropertySplit(SplitDefinition definition) {} - + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) {} #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -42,11 +42,13 @@ IEnumerable<MemberInfo> Arrays { get; } IEnumerable<MemberInfo> Dictionaries { get; } IEnumerable<MemberInfo> Properties { get; } + IEnumerable<MemberInfo> DynamicComponents { get; } IEnumerable<MemberInfo> PersistentMembers { get; } IEnumerable<SplitDefinition> SplitDefinitions { get; } IEnumerable<string> GetSplitGroupsFor(System.Type type); string GetSplitGroupFor(MemberInfo member); + System.Type GetDynamicComponentTemplate(MemberInfo member); void AddAsRootEntity(System.Type type); void AddAsComponent(System.Type type); @@ -73,5 +75,6 @@ void AddAsProperty(MemberInfo member); void AddAsPersistentMember(MemberInfo member); void AddAsPropertySplit(SplitDefinition definition); + void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -33,6 +33,8 @@ bool IsArray(MemberInfo role); bool IsDictionary(MemberInfo role); bool IsProperty(MemberInfo member); + bool IsDynamicComponent(MemberInfo member); + System.Type GetDynamicComponentTemplate(MemberInfo member); IEnumerable<string> GetPropertiesSplits(System.Type type); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -33,6 +33,9 @@ private readonly Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>> componentPropertyCustomizers = new Dictionary<PropertyPath, List<Action<IComponentAttributesMapper>>>(); + private readonly Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>> dynamicComponentCustomizers = + new Dictionary<PropertyPath, List<Action<IDynamicComponentAttributesMapper>>>(); + private readonly Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>> joinedClassCustomizers = new Dictionary<System.Type, List<Action<IJoinedSubclassAttributesMapper>>>(); @@ -159,6 +162,11 @@ AddCustomizer(componentPropertyCustomizers, member, propertyCustomizer); } + public void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer) + { + AddCustomizer(dynamicComponentCustomizers, member, propertyCustomizer); + } + public void AddCustomizer(PropertyPath member, Action<IManyToManyMapper> collectionRelationManyToManyCustomizer) { AddCustomizer(collectionRelationManyToManyCustomizers, member, collectionRelationManyToManyCustomizer); @@ -274,6 +282,11 @@ InvokeCustomizers(componentPropertyCustomizers, member, mapper); } + public void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper) + { + InvokeCustomizers(dynamicComponentCustomizers, member, mapper); + } + public void InvokeCustomizers(PropertyPath member, IManyToManyMapper mapper) { InvokeCustomizers(collectionRelationManyToManyCustomizers, member, mapper); Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/DynamicComponentCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -0,0 +1,50 @@ +using System; + +namespace NHibernate.Mapping.ByCode.Impl.CustomizersImpl +{ + public class DynamicComponentCustomizer<TComponent> : PropertyContainerCustomizer<TComponent>, IDynamicComponentMapper<TComponent> where TComponent : class + { + public DynamicComponentCustomizer(IModelExplicitDeclarationsHolder explicitDeclarationsHolder, ICustomizersHolder customizersHolder, PropertyPath propertyPath) + : base(explicitDeclarationsHolder, customizersHolder, propertyPath) + { + if (propertyPath == null) + { + throw new ArgumentNullException("propertyPath"); + } + if (explicitDeclarationsHolder == null) + { + throw new ArgumentNullException("explicitDeclarationsHolder"); + } + explicitDeclarationsHolder.AddAsDynamicComponent(propertyPath.LocalMember, typeof(TComponent)); + } + + #region IDynamicComponentMapper<TComponent> Members + + public void Access(Accessor accessor) + { + throw new NotImplementedException(); + } + + public void Access(System.Type accessorType) + { + throw new NotImplementedException(); + } + + public void OptimisticLock(bool takeInConsiderationForOptimisticLock) + { + throw new NotImplementedException(); + } + + public void Update(bool consideredInUpdateQuery) + { + throw new NotImplementedException(); + } + + public void Insert(bool consideredInInsertQuery) + { + throw new NotImplementedException(); + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/PropertyContainerCustomizer.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -83,9 +83,17 @@ TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class { - throw new NotImplementedException(); + RegisterDynamicComponentMapping(property, mapping); } + protected virtual void RegisterDynamicComponentMapping<TComponent>(Expression<Func<TEntity, IDictionary>> property, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class + { + MemberInfo member = TypeExtensions.DecodeMemberAccessExpression(property); + mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, member))); + MemberInfo memberOf = TypeExtensions.DecodeMemberAccessExpressionOf(property); + mapping(new DynamicComponentCustomizer<TComponent>(explicitDeclarationsHolder, CustomizersHolder, new PropertyPath(PropertyPath, memberOf))); + } + public void ManyToOne<TProperty>(Expression<Func<TEntity, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class { Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DefaultCandidatePersistentMembersProvider.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -23,7 +23,7 @@ public IEnumerable<MemberInfo> GetRootEntityMembers(System.Type entityClass) { - return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(entityClass, RootClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } public IEnumerable<MemberInfo> GetSubEntityMembers(System.Type entityClass, System.Type entitySuperclass) @@ -35,17 +35,23 @@ { IEnumerable<MemberInfo> propertiesOfSubclass = GetCandidatePersistentProperties(entityClass, flattenHierarchyBindingFlag); IEnumerable<MemberInfo> propertiesOfBaseClass = GetCandidatePersistentProperties(entitySuperclass, flattenHierarchyBindingFlag); - return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return propertiesOfSubclass.Except(propertiesOfBaseClass, new PropertyNameEqualityComparer()).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } else { - return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(entityClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(entityClass, SubClassPropertiesBindingFlags).Concat(GetUserDeclaredFields(entityClass).Cast<MemberInfo>()); } } + protected IEnumerable<FieldInfo> GetUserDeclaredFields(System.Type type) + { + // can't find another way to exclude fields generated by the compiler (for both auto-properties and anonymous-types) + return type.GetFields(ClassFieldsBindingFlags).Where(x=> !x.Name.StartsWith("<")); + } + public IEnumerable<MemberInfo> GetComponentMembers(System.Type componentClass) { - return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(componentClass.GetFields(ClassFieldsBindingFlags)); + return GetCandidatePersistentProperties(componentClass, ComponentPropertiesBindingFlags).Concat(GetUserDeclaredFields(componentClass).Cast<MemberInfo>()); } #endregion @@ -55,7 +61,7 @@ System.Type analizing = type; while (analizing != null && analizing != typeof (object)) { - foreach (FieldInfo fieldInfo in analizing.GetFields(ClassFieldsBindingFlags)) + foreach (FieldInfo fieldInfo in GetUserDeclaredFields(analizing)) { yield return fieldInfo; } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ExplicitDeclarationsHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -21,6 +20,8 @@ private readonly HashSet<MemberInfo> oneToOneRelations = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> poids = new HashSet<MemberInfo>(); private readonly HashSet<MemberInfo> properties = new HashSet<MemberInfo>(); + private readonly HashSet<MemberInfo> dynamicComponents = new HashSet<MemberInfo>(); + private readonly Dictionary<MemberInfo, System.Type> dynamicComponentTemplates = new Dictionary<MemberInfo, System.Type>(); private readonly HashSet<MemberInfo> persistentMembers = new HashSet<MemberInfo>(); private readonly HashSet<System.Type> rootEntities = new HashSet<System.Type>(); private readonly HashSet<MemberInfo> sets = new HashSet<MemberInfo>(); @@ -132,6 +133,11 @@ get { return properties; } } + public IEnumerable<MemberInfo> DynamicComponents + { + get { return dynamicComponents; } + } + public IEnumerable<MemberInfo> PersistentMembers { get { return persistentMembers; } @@ -152,6 +158,13 @@ return null; } + public System.Type GetDynamicComponentTemplate(MemberInfo member) + { + System.Type template; + dynamicComponentTemplates.TryGetValue(member, out template); + return template ?? typeof(object); + } + public void AddAsRootEntity(System.Type type) { rootEntities.Add(type); @@ -262,6 +275,12 @@ splitDefinitions.Add(definition); } + public void AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + dynamicComponents.Add(member); + dynamicComponentTemplates[member] = componentTemplate; + } + #endregion } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ICustomizersHolder.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -24,6 +24,7 @@ void AddCustomizer(PropertyPath member, Action<IIdBagPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<ICollectionPropertiesMapper> propertyCustomizer); void AddCustomizer(PropertyPath member, Action<IComponentAttributesMapper> propertyCustomizer); + void AddCustomizer(PropertyPath member, Action<IDynamicComponentAttributesMapper> propertyCustomizer); void InvokeCustomizers(System.Type type, IClassMapper mapper); void InvokeCustomizers(System.Type type, ISubclassMapper mapper); @@ -43,6 +44,7 @@ void InvokeCustomizers(PropertyPath member, IMapPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IIdBagPropertiesMapper mapper); void InvokeCustomizers(PropertyPath member, IComponentAttributesMapper mapper); + void InvokeCustomizers(PropertyPath member, IDynamicComponentAttributesMapper mapper); #region Collection Element relations invokers Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelExplicitDeclarationsHolderExtensions.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -36,6 +36,11 @@ System.Array.ForEach(source.Properties.ToArray(), destination.AddAsProperty); System.Array.ForEach(source.PersistentMembers.ToArray(), destination.AddAsPersistentMember); System.Array.ForEach(source.SplitDefinitions.ToArray(), destination.AddAsPropertySplit); + foreach (var dynamicComponent in source.DynamicComponents) + { + var template = source.GetDynamicComponentTemplate(dynamicComponent); + destination.AddAsDynamicComponent(dynamicComponent, template); + } } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ModelMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -903,6 +903,10 @@ { MapOneToOne(member, memberPath, propertiesContainer); } + else if (modelInspector.IsDynamicComponent(property)) + { + MapDynamicComponent(member, memberPath, propertyType, propertiesContainer); + } else if (modelInspector.IsSet(property)) { MapSet(member, memberPath, propertyType, propertiesContainer, propertiesContainerType); @@ -938,6 +942,19 @@ } } + private void MapDynamicComponent(MemberInfo member, PropertyPath memberPath, System.Type propertyType, IPropertyContainerMapper propertiesContainer) + { + propertiesContainer.Component(member, (IDynamicComponentMapper componentMapper) => + { + System.Type componentType = modelInspector.GetDynamicComponentTemplate(member); + IEnumerable<MemberInfo> persistentProperties = membersProvider.GetComponentMembers(componentType); + + ForEachMemberPath(member, memberPath, pp => customizerHolder.InvokeCustomizers(pp, componentMapper)); + + MapProperties(propertyType, persistentProperties, componentMapper, memberPath); + }); + } + private void MapAny(MemberInfo member, PropertyPath memberPath, IBasePlainPropertyContainerMapper propertiesContainer) { propertiesContainer.Any(member, typeof (int), anyMapper => Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/SimpleModelInspector.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -27,6 +27,7 @@ private Func<MemberInfo, bool, bool> isVersion = (m, declared) => declared; private Func<MemberInfo, bool, bool> isProperty = (m, declared) => declared; + private Func<MemberInfo, bool, bool> isDynamicComponent = (m, declared) => declared; private Func<MemberInfo, bool, bool> isAny = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToMany = (m, declared) => declared; private Func<MemberInfo, bool, bool> isManyToOne; @@ -341,6 +342,11 @@ get { return declaredModel.SplitDefinitions; } } + IEnumerable<MemberInfo> IModelExplicitDeclarationsHolder.DynamicComponents + { + get { return declaredModel.DynamicComponents; } + } + IEnumerable<string> IModelExplicitDeclarationsHolder.GetSplitGroupsFor(System.Type type) { return declaredModel.GetSplitGroupsFor(type); @@ -461,6 +467,11 @@ declaredModel.AddAsPropertySplit(definition); } + void IModelExplicitDeclarationsHolder.AddAsDynamicComponent(MemberInfo member, System.Type componentTemplate) + { + declaredModel.AddAsDynamicComponent(member, componentTemplate); + } + #endregion #region Implementation of IModelInspector @@ -603,6 +614,21 @@ return isProperty(member, declaredResult); } + bool IModelInspector.IsDynamicComponent(MemberInfo member) + { + bool declaredResult = declaredModel.IsDynamicComponent(member); + return isDynamicComponent(member, declaredResult); + } + + System.Type IModelInspector.GetDynamicComponentTemplate(MemberInfo member) + { + return declaredModel.GetDynamicComponentTemplate(member); + } + System.Type IModelExplicitDeclarationsHolder.GetDynamicComponentTemplate(MemberInfo member) + { + return declaredModel.GetDynamicComponentTemplate(member); + } + IEnumerable<string> IModelInspector.GetPropertiesSplits(System.Type type) { IEnumerable<string> declaredResult = declaredModel.GetPropertiesSplits(type); @@ -826,5 +852,14 @@ } isTablePerClassSplit = match; } + + public void IsDynamicComponent(Func<MemberInfo, bool, bool> match) + { + if (match == null) + { + return; + } + isDynamicComponent = match; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-22 14:14:26 UTC (rev 5736) @@ -295,6 +295,7 @@ <Compile Include="Mapping\ByCode\Conformist\SubclassMapping.cs" /> <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> <Compile Include="Mapping\ByCode\PropertyToField.cs" /> <Compile Include="Mapping\ByCode\SimpleModelInspector.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.ExpliticMappingTests +{ + public class DynamicComponentMappingTests + { + private class Person + { + public int Id { get; set; } + public IDictionary Info { get; set; } + } + + [Test] + public void WhenMapDynCompoThenMapItAndItsProperties() + { + var mapper = new ModelMapper(); + mapper.Class<Person>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Component(x => x.Info, new { MyInt = 5, MyDate = DateTime.Now }, z => { }); + }); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().SingleOrDefault(); + hbmDynamicComponent.Should().Not.Be.Null(); + hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate"); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ModelExplicitDeclarationsHolderMergeTest.cs 2011-04-22 14:14:26 UTC (rev 5736) @@ -259,6 +259,18 @@ destination.RootEntities.Should().Have.Count.EqualTo(1); } + [Test] + public void MergeDynamicComponents() + { + var destination = new ExplicitDeclarationsHolder(); + var source = new ExplicitDeclarationsHolder(); + source.AddAsDynamicComponent(property, typeof(MyClass)); + + destination.Merge(source); + destination.DynamicComponents.Should().Have.Count.EqualTo(1); + destination.GetDynamicComponentTemplate(property).Should().Be(typeof(MyClass)); + } + #region Nested type: MyClass private class MyClass Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 02:55:49 UTC (rev 5735) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 14:14:26 UTC (rev 5736) @@ -536,6 +536,7 @@ <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\ModelMapperAddMappingByTypeTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\SubclassMappingRegistration.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\ConformistMappingRegistrationTests\UnionSubclassMappingRegistrationTest.cs" /> + <Compile Include="MappingByCode\ExpliticMappingTests\DynamicComponentMappingTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\IdBagMappingTest.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\MappingOfPrivateMembersOnRootEntity.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\NaturalIdTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 15:07:36
|
Revision: 5737 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5737&view=rev Author: fabiomaulo Date: 2011-04-22 15:07:29 +0000 (Fri, 22 Apr 2011) Log Message: ----------- DynamicComponentMapper set property type by default and ignore accessor setting Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -26,6 +26,18 @@ component.Items = component.Items == null ? toAdd : component.Items.Concat(toAdd).ToArray(); } + public override void Property(MemberInfo property, Action<IPropertyMapper> mapping) + { + var hbmProperty = new HbmProperty + { + name = property.Name, + type1 = property.GetPropertyOrFieldType().GetNhTypeName() + }; + + mapping(new PropertyMapper(property, hbmProperty, new NoMemberPropertyMapper())); + AddProperty(hbmProperty); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/PropertyMapper.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -14,6 +14,21 @@ private readonly MemberInfo member; private readonly HbmProperty propertyMapping; + public PropertyMapper(MemberInfo member, HbmProperty propertyMapping, IAccessorPropertyMapper accessorMapper) + { + if (propertyMapping == null) + { + throw new ArgumentNullException("propertyMapping"); + } + this.member = member; + this.propertyMapping = propertyMapping; + if (member == null) + { + this.propertyMapping.access = "none"; + } + entityPropertyMapper = accessorMapper; + } + public PropertyMapper(MemberInfo member, HbmProperty propertyMapping) { if (propertyMapping == null) Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/ExpliticMappingTests/DynamicComponentMappingTests.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -32,5 +32,21 @@ hbmDynamicComponent.Should().Not.Be.Null(); hbmDynamicComponent.Properties.Select(x=> x.Name).Should().Have.SameValuesAs("MyInt", "MyDate"); } + + [Test] + public void WhenMapDynCompoPropertiesThenShouldAssignPropertyType() + { + var mapper = new ModelMapper(); + mapper.Class<Person>(map => + { + map.Id(x => x.Id, idmap => { }); + map.Component(x => x.Info, new { MyInt = 5, MyDate = DateTime.Now }, z => { }); + }); + + var hbmMapping = mapper.CompileMappingFor(new[] { typeof(Person) }); + var hbmClass = hbmMapping.RootClasses[0]; + var hbmDynamicComponent = hbmClass.Properties.OfType<HbmDynamicComponent>().Single(); + hbmDynamicComponent.Properties.OfType<HbmProperty>().Select(x => x.type1).All(x=> x.Satisfy(value=> !string.IsNullOrEmpty(value))); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/PropertyMapperTest.cs 2011-04-22 15:07:29 UTC (rev 5737) @@ -0,0 +1,458 @@ +using System; +using System.Linq; +using System.Data; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Engine; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NHibernate.Properties; +using NHibernate.SqlTypes; +using NHibernate.Type; +using NHibernate.UserTypes; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class PropertyMapperTest + { + private enum MyEnum + { + One + } + private class MyClass + { + public string Autoproperty { get; set; } + public string ReadOnly { get { return ""; } } + public MyEnum EnumProp { get; set; } + } + + private class MyAccessorMapper : IAccessorPropertyMapper + { + public bool AccessorCalled { get; set; } + public void Access(Accessor accessor) + { + AccessorCalled = true; + } + + public void Access(System.Type accessorType) + { + + } + } + [Test] + public void WhenCreateWithGivenAccessorMapperThenUseTheGivenAccessoMapper() + { + var member = typeof (MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var myAccessorMapper = new MyAccessorMapper(); + var mapper = new PropertyMapper(member, mapping, myAccessorMapper); + mapper.Access(Accessor.Field); + myAccessorMapper.AccessorCalled.Should().Be.True(); + } + + [Test] + public void WhenSettingByTypeThenCheckCompatibility() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + Executing.This(() => mapper.Access(typeof(object))).Should().Throw<ArgumentOutOfRangeException>(); + Executing.This(() => mapper.Access(typeof(FieldAccessor))).Should().NotThrow(); + mapping.Access.Should().Be.EqualTo(typeof(FieldAccessor).AssemblyQualifiedName); + } + + [Test] + public void WhenSetTypeByITypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type(NHibernateUtil.String); + + mapping.Type.name.Should().Be.EqualTo("String"); + } + + [Test] + public void WhenSetTypeByIUserTypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(); + + mapping.Type.name.Should().Contain("MyType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByICompositeUserTypeThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyCompoType>(); + + mapping.Type.name.Should().Contain("MyCompoType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByIUserTypeWithParamsThenSetType() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(new { Param1 = "a", Param2 = 12 }); + + mapping.type1.Should().Be.Null(); + mapping.Type.name.Should().Contain("MyType"); + mapping.Type.param.Should().Have.Count.EqualTo(2); + mapping.Type.param.Select(p => p.name).Should().Have.SameValuesAs("Param1", "Param2"); + mapping.Type.param.Select(p => p.GetText()).Should().Have.SameValuesAs("a", "12"); + } + + [Test] + public void WhenSetTypeByIUserTypeWithNullParamsThenSetTypeName() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(null); + + mapping.Type.name.Should().Contain("MyType"); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetTypeByITypeTypeThenSetType() + { + var member = For<MyClass>.Property(c => c.EnumProp); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<EnumStringType<MyEnum>>(); + + mapping.Type.name.Should().Contain(typeof(EnumStringType<MyEnum>).FullName); + mapping.type.Should().Be.Null(); + } + + [Test] + public void WhenSetInvalidTypeThenThrow() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + Executing.This(() => mapper.Type(typeof(object), null)).Should().Throw<ArgumentOutOfRangeException>(); + Executing.This(() => mapper.Type(null, null)).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenSetDifferentColumnNameThenSetTheName() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => cm.Name("pepe")); + + mapping.Columns.Should().Have.Count.EqualTo(1); + mapping.Columns.Single().name.Should().Be("pepe"); + } + + [Test] + public void WhenSetDefaultColumnNameThenDoesNotSetTheName() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => { cm.Name("Autoproperty"); cm.Length(50); }); + mapping.column.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.Columns.Should().Be.Empty(); + } + + [Test] + public void WhenSetBasicColumnValuesThenSetPlainValues() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => + { + cm.Length(50); + cm.NotNullable(true); + }); + mapping.Items.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.notnull.Should().Be(true); + mapping.notnullSpecified.Should().Be(true); + } + + [Test] + public void WhenSetColumnValuesThenAddColumnTag() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => + { + cm.SqlType("VARCHAR(50)"); + cm.NotNullable(true); + }); + mapping.Items.Should().Not.Be.Null(); + mapping.Columns.Should().Have.Count.EqualTo(1); + } + + [Test] + public void WhenSetBasicColumnValuesMoreThanOnesThenMergeColumn() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column(cm => cm.Length(50)); + mapper.Column(cm => cm.NotNullable(true)); + + mapping.Items.Should().Be.Null(); + mapping.length.Should().Be("50"); + mapping.notnull.Should().Be(true); + mapping.notnullSpecified.Should().Be(true); + } + + [Test] + public void WhenSetMultiColumnsValuesThenAddColumns() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Type<MyType>(); + mapper.Columns(cm => + { + cm.Name("column1"); + cm.Length(50); + }, cm => + { + cm.Name("column2"); + cm.SqlType("VARCHAR(10)"); + }); + mapping.Columns.Should().Have.Count.EqualTo(2); + } + + [Test] + public void WhenSetMultiColumnsValuesThenAutoassignColumnNames() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)")); + mapping.Columns.Should().Have.Count.EqualTo(2); + mapping.Columns.All(cm => cm.name.Satisfy(n => !string.IsNullOrEmpty(n))); + } + + [Test] + public void AfterSetMultiColumnsCantSetSimpleColumn() + { + var member = typeof(MyClass).GetProperty("ReadOnly"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Columns(cm => cm.Length(50), cm => cm.SqlType("VARCHAR(10)")); + Executing.This(() => mapper.Column(cm => cm.Length(50))).Should().Throw<MappingException>(); + } + + [Test] + public void WhenSetBasicColumnValuesThroughShortCutThenMergeColumn() + { + var member = typeof(MyClass).GetProperty("Autoproperty"); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + mapper.Column("pizza"); + mapper.Length(50); + mapper.Precision(10); + mapper.Scale(2); + mapper.NotNullable(true); + mapper.Unique(true); + mapper.UniqueKey("AA"); + mapper.Index("II"); + + mapping.Items.Should().Be.Null(); + mapping.column.Should().Be("pizza"); + mapping.length.Should().Be("50"); + mapping.precision.Should().Be("10"); + mapping.scale.Should().Be("2"); + mapping.notnull.Should().Be(true); + mapping.unique.Should().Be(true); + mapping.uniquekey.Should().Be("AA"); + mapping.index.Should().Be("II"); + } + + [Test] + public void WhenSetUpdateThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Update(false); + mapping.update.Should().Be.False(); + mapping.updateSpecified.Should().Be.True(); + } + + [Test] + public void WhenSetInsertThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Insert(false); + mapping.insert.Should().Be.False(); + mapping.insertSpecified.Should().Be.True(); + } + + [Test] + public void WhenSetLazyThenSetAttributes() + { + var member = For<MyClass>.Property(x => x.ReadOnly); + var mapping = new HbmProperty(); + var mapper = new PropertyMapper(member, mapping); + + mapper.Lazy(true); + mapping.lazy.Should().Be.True(); + mapping.IsLazyProperty.Should().Be.True(); + } + } + + public class MyType : IUserType + { + #region Implementation of IUserType + + public bool Equals(object x, object y) + { + throw new NotImplementedException(); + } + + public int GetHashCode(object x) + { + throw new NotImplementedException(); + } + + public object NullSafeGet(IDataReader rs, string[] names, object owner) + { + throw new NotImplementedException(); + } + + public void NullSafeSet(IDbCommand cmd, object value, int index) + { + throw new NotImplementedException(); + } + + public object DeepCopy(object value) + { + throw new NotImplementedException(); + } + + public object Replace(object original, object target, object owner) + { + throw new NotImplementedException(); + } + + public object Assemble(object cached, object owner) + { + throw new NotImplementedException(); + } + + public object Disassemble(object value) + { + throw new NotImplementedException(); + } + + public SqlType[] SqlTypes + { + get { throw new NotImplementedException(); } + } + + public System.Type ReturnedType + { + get { throw new NotImplementedException(); } + } + + public bool IsMutable + { + get { throw new NotImplementedException(); } + } + + #endregion + } + + public class MyCompoType : ICompositeUserType + { + public object GetPropertyValue(object component, int property) + { + throw new NotImplementedException(); + } + + public void SetPropertyValue(object component, int property, object value) + { + throw new NotImplementedException(); + } + + public bool Equals(object x, object y) + { + throw new NotImplementedException(); + } + + public int GetHashCode(object x) + { + throw new NotImplementedException(); + } + + public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public void NullSafeSet(IDbCommand cmd, object value, int index, bool[] settable, ISessionImplementor session) + { + throw new NotImplementedException(); + } + + public object DeepCopy(object value) + { + throw new NotImplementedException(); + } + + public object Disassemble(object value, ISessionImplementor session) + { + throw new NotImplementedException(); + } + + public object Assemble(object cached, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public object Replace(object original, object target, ISessionImplementor session, object owner) + { + throw new NotImplementedException(); + } + + public string[] PropertyNames + { + get { throw new NotImplementedException(); } + } + + public IType[] PropertyTypes + { + get { throw new NotImplementedException(); } + } + + public System.Type ReturnedClass + { + get { throw new NotImplementedException(); } + } + + public bool IsMutable + { + get { throw new NotImplementedException(); } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 14:14:26 UTC (rev 5736) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 15:07:29 UTC (rev 5737) @@ -557,6 +557,7 @@ <Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\JoinedSubclassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\JoinMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\PropertyMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\SubclassMapperWithJoinPropertiesTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 16:11:44
|
Revision: 5739 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5739&view=rev Author: fabiomaulo Date: 2011-04-22 16:11:38 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add component property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -12,11 +12,16 @@ private ComponentParentMapper parentMapper; public ComponentMapper(HbmComponent component, System.Type componentType, MemberInfo declaringTypeMember, HbmMapping mapDoc) + : this(component,componentType, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) + { + } + + public ComponentMapper(HbmComponent component, System.Type componentType, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc) : base(componentType, mapDoc) { this.component = component; component.@class = componentType.GetShortClassName(mapDoc); - accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x); + accessorPropertyMapper = accessorMapper; } #region Overrides of AbstractPropertyContainerMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -38,6 +38,13 @@ AddProperty(hbmProperty); } + public override void Component(MemberInfo property, Action<IComponentMapper> mapping) + { + var hbm = new HbmComponent { name = property.Name }; + mapping(new ComponentMapper(hbm, property.GetPropertyOrFieldType(), new NoMemberPropertyMapper(), MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ComponentPropertyOnDynamicCompoTests.cs 2011-04-22 16:11:38 UTC (rev 5739) @@ -0,0 +1,67 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class ComponentPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Something { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.Component(propertyInfo, (IComponentMapper x) => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Component(propertyInfo, (IComponentMapper x) => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.Component(propertyInfo, (IComponentMapper x) => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmComponent>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 15:36:27 UTC (rev 5738) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 16:11:38 UTC (rev 5739) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 17:38:04
|
Revision: 5740 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5740&view=rev Author: fabiomaulo Date: 2011-04-22 17:37:58 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add dyn-component property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 16:11:38 UTC (rev 5739) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) @@ -10,10 +10,14 @@ private readonly HbmDynamicComponent component; private readonly IAccessorPropertyMapper accessorPropertyMapper; - public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) : base(declaringTypeMember.DeclaringType, mapDoc) + public DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, HbmMapping mapDoc) + : this(component, declaringTypeMember, new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x), mapDoc) {} + + private DynamicComponentMapper(HbmDynamicComponent component, MemberInfo declaringTypeMember, IAccessorPropertyMapper accessorMapper, HbmMapping mapDoc) + : base(declaringTypeMember.DeclaringType, mapDoc) { this.component = component; - accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => component.access = x); + accessorPropertyMapper = accessorMapper; } protected override void AddProperty(object property) @@ -45,6 +49,13 @@ AddProperty(hbm); } + public override void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping) + { + var hbm = new HbmDynamicComponent { name = property.Name }; + mapping(new DynamicComponentMapper(hbm, property, new NoMemberPropertyMapper(), MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/DynComponentPropertyOnDynamicCompoTests.cs 2011-04-22 17:37:58 UTC (rev 5740) @@ -0,0 +1,63 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class DynComponentPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("Info"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + var called = false; + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = For<Person>.Property(p => p.Info);//just as another dyn-compo + + mapper.Component(propertyInfo, (IDynamicComponentMapper x) => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmDynamicComponent>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 16:11:38 UTC (rev 5739) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:37:58 UTC (rev 5740) @@ -553,6 +553,7 @@ <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 17:51:29
|
Revision: 5741 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5741&view=rev Author: fabiomaulo Date: 2011-04-22 17:51:22 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add many-to-one property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -56,6 +56,13 @@ AddProperty(hbm); } + public override void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + { + var hbm = new HbmManyToOne { name = property.Name }; + mapping(new ManyToOneMapper(property, new NoMemberPropertyMapper(), hbm, MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ManyToOneMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -14,6 +14,9 @@ private readonly MemberInfo member; public ManyToOneMapper(MemberInfo member, HbmManyToOne manyToOne, HbmMapping mapDoc) + : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x), manyToOne, mapDoc) {} + + public ManyToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorPropertyMapper, HbmManyToOne manyToOne, HbmMapping mapDoc) { this.member = member; this.manyToOne = manyToOne; @@ -22,14 +25,7 @@ { this.manyToOne.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => manyToOne.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorPropertyMapper; } #region Implementation of IManyToOneMapper Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ManyToOnePropertyOnDynamicCompoTests.cs 2011-04-22 17:51:22 UTC (rev 5741) @@ -0,0 +1,67 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class ManyToOnePropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Id { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.ManyToOne(propertyInfo, x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.ManyToOne(propertyInfo, x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.ManyToOne(propertyInfo, x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmManyToOne>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:37:58 UTC (rev 5740) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:51:22 UTC (rev 5741) @@ -554,6 +554,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:04:26
|
Revision: 5742 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5742&view=rev Author: fabiomaulo Date: 2011-04-22 18:04:20 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add any property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractBasePropertyContainerMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -84,7 +84,7 @@ AddProperty(hbm); } - public void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + public virtual void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) { if (!IsMemberSupportedByMappedContainer(property)) { Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -20,6 +20,9 @@ private readonly MemberInfo member; public AnyMapper(MemberInfo member, System.Type foreignIdType, HbmAny any, HbmMapping mapDoc) + : this(member, foreignIdType, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x), any, mapDoc) {} + + public AnyMapper(MemberInfo member, System.Type foreignIdType, IAccessorPropertyMapper accessorMapper, HbmAny any, HbmMapping mapDoc) { this.member = member; this.foreignIdType = foreignIdType; @@ -29,14 +32,7 @@ { this.any.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper; if (foreignIdType == null) { throw new ArgumentNullException("foreignIdType"); @@ -53,7 +49,7 @@ var classHbmColumn = new HbmColumn(); string classColumnName = member == null ? DefaultMetaColumnNameWhenNoProperty : member.Name + "Class"; classColumnMapper = new ColumnMapper(classHbmColumn, classColumnName); - any.column = new[] {classHbmColumn, idHbmColumn}; + any.column = new[] { classHbmColumn, idHbmColumn }; } #region Implementation of IAccessorPropertyMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -63,6 +63,13 @@ AddProperty(hbm); } + public override void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) + { + var hbm = new HbmAny { name = property.Name }; + mapping(new AnyMapper(property, idTypeOfMetaType, new NoMemberPropertyMapper(), hbm, MapDoc)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/AnyPropertyOnDynamicCompoTests.cs 2011-04-22 18:04:20 UTC (rev 5742) @@ -0,0 +1,63 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class AnyPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + mapper.Any(propertyInfo, typeof(int), x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Any(propertyInfo, typeof(int), x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (object)null }).GetType().GetProperty("A"); + + mapper.Any(propertyInfo, typeof(int), x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmAny>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 17:51:22 UTC (rev 5741) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:04:20 UTC (rev 5742) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:10:34
|
Revision: 5743 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5743&view=rev Author: fabiomaulo Date: 2011-04-22 18:10:28 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add one-to-one property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -70,6 +70,13 @@ AddProperty(hbm); } + public override void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping) + { + var hbm = new HbmOneToOne { name = property.Name }; + mapping(new OneToOneMapper(property, new NoMemberPropertyMapper(), hbm)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/OneToOneMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -11,6 +11,9 @@ private readonly HbmOneToOne oneToOne; public OneToOneMapper(MemberInfo member, HbmOneToOne oneToOne) + : this(member, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x), oneToOne) {} + + public OneToOneMapper(MemberInfo member, IAccessorPropertyMapper accessorMapper, HbmOneToOne oneToOne) { this.member = member; this.oneToOne = oneToOne; @@ -18,14 +21,7 @@ { this.oneToOne.access = "none"; } - if (member == null) - { - entityPropertyMapper = new NoMemberPropertyMapper(); - } - else - { - entityPropertyMapper = new AccessorPropertyMapper(member.DeclaringType, member.Name, x => oneToOne.access = x); - } + entityPropertyMapper = member == null ? new NoMemberPropertyMapper() : accessorMapper; } #region Implementation of IOneToOneMapper Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/OneToOnePropertyOnDynamicCompoTests.cs 2011-04-22 18:10:28 UTC (rev 5743) @@ -0,0 +1,67 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class OneToOnePropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + private class MyClass + { + public int Id { get; set; } + } + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.OneToOne(propertyInfo, x => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + var called = false; + mapper.OneToOne(propertyInfo, x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (MyClass)null }).GetType().GetProperty("A"); + + mapper.OneToOne(propertyInfo, x => x.Access(Accessor.Field)); + + component.Properties.OfType<HbmOneToOne>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:04:20 UTC (rev 5742) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:10:28 UTC (rev 5743) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:20:37
|
Revision: 5744 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5744&view=rev Author: fabiomaulo Date: 2011-04-22 18:20:31 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add bag property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/BagMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -15,6 +15,9 @@ private ICacheMapper cacheMapper; public BagMapper(System.Type ownerType, System.Type elementType, HbmBag mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public BagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmBag mapping) { if (ownerType == null) { @@ -36,7 +39,7 @@ mapping.key = new HbmKey(); } keyMapper = new KeyMapper(ownerType, mapping.Key); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -77,6 +77,16 @@ AddProperty(hbm); } + public override void Bag(MemberInfo property, Action<IBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmBag { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new BagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/BagPropertyOnDynamicCompoTests.cs 2011-04-22 18:20:31 UTC (rev 5744) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class BagPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Bag(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Bag(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Bag(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmBag>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:10:28 UTC (rev 5743) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:20:31 UTC (rev 5744) @@ -552,6 +552,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:26:15
|
Revision: 5745 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5745&view=rev Author: fabiomaulo Date: 2011-04-22 18:26:08 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add set property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -87,6 +87,16 @@ AddProperty(hbm); } + public override void Set(MemberInfo property, Action<ISetPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmSet { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new SetMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/SetMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -15,6 +15,9 @@ private ICacheMapper cacheMapper; public SetMapper(System.Type ownerType, System.Type elementType, HbmSet mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public SetMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmSet mapping) { if (ownerType == null) { @@ -36,7 +39,7 @@ mapping.key = new HbmKey(); } keyMapper = new KeyMapper(ownerType, mapping.Key); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/SetPropertyOnDynamicCompoTests.cs 2011-04-22 18:26:08 UTC (rev 5745) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class SetPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Set(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Set(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.Set(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmSet>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:20:31 UTC (rev 5744) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:26:08 UTC (rev 5745) @@ -558,6 +558,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\FakeUserCollectionType.cs" /> <Compile Include="MappingByCode\MappersTests\IdBagMapperTest.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:31:50
|
Revision: 5746 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5746&view=rev Author: fabiomaulo Date: 2011-04-22 18:31:43 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add list property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -97,6 +97,16 @@ AddProperty(hbm); } + public override void List(MemberInfo property, Action<IListPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmList { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new ListMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item1 = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ListMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -16,6 +16,9 @@ private ICacheMapper cacheMapper; public ListMapper(System.Type ownerType, System.Type elementType, HbmList mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public ListMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmList mapping) { if (ownerType == null) { @@ -40,7 +43,7 @@ var listIndex = new HbmListIndex(); mapping.Item = listIndex; listIndexMapper = new ListIndexMapper(ownerType, listIndex); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/ListPropertyOnDynamicCompoTests.cs 2011-04-22 18:31:43 UTC (rev 5746) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class ListPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.List(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.List(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.List(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmList>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:26:08 UTC (rev 5745) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:31:43 UTC (rev 5746) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:40:17
|
Revision: 5747 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5747&view=rev Author: fabiomaulo Date: 2011-04-22 18:40:11 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add map property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -107,6 +107,19 @@ AddProperty(hbm); } + public override void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping, Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmMap { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType(); + System.Type dictionaryValueType = propertyType.DetermineDictionaryValueType(); + + collectionMapping(new MapMapper(container, dictionaryKeyType, dictionaryValueType, new NoMemberPropertyMapper(), hbm, mapDoc)); + keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, mapDoc)); + mapping(new CollectionElementRelation(dictionaryValueType, MapDoc, rel => hbm.Item1 = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/MapMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -16,6 +16,9 @@ private ICacheMapper cacheMapper; public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, HbmMap mapping, HbmMapping mapDoc) + : this(ownerType, keyType, valueType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping, mapDoc) {} + + public MapMapper(System.Type ownerType, System.Type keyType, System.Type valueType, IAccessorPropertyMapper accessorMapper, HbmMap mapping, HbmMapping mapDoc) { if (ownerType == null) { @@ -52,7 +55,7 @@ { mapping.Item = new HbmMapKeyManyToMany {@class = KeyType.GetShortClassName(mapDoc)}; } - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/MapPropertyOnDynamicCompoTests.cs 2011-04-22 18:40:11 UTC (rev 5747) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class MapPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + mapper.Map(propertyInfo, x => { }, km => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.Map(propertyInfo, x => called = true, km => { }, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IDictionary<int, int>)null }).GetType().GetProperty("A"); + + mapper.Map(propertyInfo, x => x.Access(Accessor.Field), km => { }, rel => { }); + + component.Properties.OfType<HbmMap>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:31:43 UTC (rev 5746) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:40:11 UTC (rev 5747) @@ -558,6 +558,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\OneToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SetPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\SimplePropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-22 18:54:36
|
Revision: 5748 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5748&view=rev Author: fabiomaulo Date: 2011-04-22 18:54:29 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Fix add idbag property to a dynamic-component Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AbstractPropertyContainerMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -61,7 +61,7 @@ AddProperty(hbm); } - public void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + public virtual void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) { var hbm = new HbmIdbag { name = property.Name }; System.Type propertyType = property.GetPropertyOrFieldType(); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/DynamicComponentMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -120,6 +120,16 @@ AddProperty(hbm); } + public override void IdBag(MemberInfo property, Action<IIdBagPropertiesMapper> collectionMapping, Action<ICollectionElementRelation> mapping) + { + var hbm = new HbmIdbag { name = property.Name }; + System.Type propertyType = property.GetPropertyOrFieldType(); + System.Type collectionElementType = propertyType.DetermineCollectionElementType(); + collectionMapping(new IdBagMapper(container, collectionElementType, new NoMemberPropertyMapper(), hbm)); + mapping(new CollectionElementRelation(collectionElementType, MapDoc, rel => hbm.Item = rel)); + AddProperty(hbm); + } + protected override bool IsMemberSupportedByMappedContainer(MemberInfo property) { return true; Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/IdBagMapper.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -16,6 +16,9 @@ private readonly CollectionIdMapper idMapper; public IdBagMapper(System.Type ownerType, System.Type elementType, HbmIdbag mapping) + : this(ownerType, elementType, new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x), mapping) {} + + public IdBagMapper(System.Type ownerType, System.Type elementType, IAccessorPropertyMapper accessorMapper, HbmIdbag mapping) { if (ownerType == null) { @@ -42,7 +45,7 @@ mapping.collectionid = new HbmCollectionId(); } idMapper = new CollectionIdMapper(mapping.collectionid); - entityPropertyMapper = new AccessorPropertyMapper(ownerType, mapping.Name, x => mapping.access = x); + entityPropertyMapper = accessorMapper; } public System.Type OwnerType { get; private set; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/DynamicComponentMapperTests/IdBagPropertyOnDynamicCompoTests.cs 2011-04-22 18:54:29 UTC (rev 5748) @@ -0,0 +1,64 @@ +using System.Collections; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; +using System.Collections.Generic; + +namespace NHibernate.Test.MappingByCode.MappersTests.DynamicComponentMapperTests +{ + public class IdBagPropertyOnDynamicCompoTests + { + private class Person + { + public int Id { get; set; } + private IDictionary info; + public IDictionary Info + { + get { return info; } + } + } + + [Test] + public void WhenAddThenHas() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.IdBag(propertyInfo, x => { }, rel => { }); + + component.Properties.Select(x => x.Name).Should().Have.SameSequenceAs("A"); + } + + [Test] + public void WhenCustomizeThenCallCustomizer() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + var called = false; + mapper.IdBag(propertyInfo, x => called = true, rel => { }); + + called.Should().Be.True(); + } + + [Test] + public void WhenCustomizeAccessorThenIgnore() + { + var mapdoc = new HbmMapping(); + var component = new HbmDynamicComponent(); + var mapper = new DynamicComponentMapper(component, For<Person>.Property(p => p.Info), mapdoc); + var propertyInfo = (new { A = (IEnumerable<int>)null }).GetType().GetProperty("A"); + + mapper.IdBag(propertyInfo, x => x.Access(Accessor.Field), rel => { }); + + component.Properties.OfType<HbmIdbag>().Single().Access.Should().Be.NullOrEmpty(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:40:11 UTC (rev 5747) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 18:54:29 UTC (rev 5748) @@ -556,6 +556,7 @@ <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynCompAttributesSettingTest.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\DynComponentPropertyOnDynamicCompoTests.cs" /> + <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\IdBagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ListPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ManyToOnePropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\MapPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-23 18:51:43
|
Revision: 5751 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5751&view=rev Author: fabiomaulo Date: 2011-04-23 18:51:34 +0000 (Sat, 23 Apr 2011) Log Message: ----------- - Fix NH-2669 (patch completed, and test fixed) thanks to Rory Plaire to port the Hb fix - Fix NH-2670 - Fix ByCode (subclass registration and TypeNameUtil) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Engine/IPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -393,5 +393,8 @@ bool IsReadOnly(object entityOrProxy); void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId); + + /// <summary>Is in a two-phase load? </summary> + bool IsLoadFinished { get; } } } Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -1205,6 +1205,14 @@ oldEntry.LoadedWithLazyPropertiesUnfetched); } + public bool IsLoadFinished + { + get + { + return loadCounter == 0; + } + } + #endregion public override string ToString() Modified: trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -53,7 +53,15 @@ public override void InitializeCollection(IPersistentCollection collection, bool writing) { - throw new SessionException("collections cannot be fetched by a stateless session"); + if(temporaryPersistenceContext.IsLoadFinished) + { + throw new SessionException("Collections cannot be fetched by a stateless session. You can eager load it through specific query."); + } + CollectionEntry ce = temporaryPersistenceContext.GetCollectionEntry(collection); + if (!collection.WasInitialized) + { + ce.LoadedPersister.Initialize(ce.LoadedKey, this); + } } public override object InternalLoad(string entityName, object id, bool eager, bool isNullable) @@ -733,7 +741,10 @@ { CheckAndUpdateSessionStatus(); object result = Factory.GetEntityPersister(entityName).Load(id, null, lockMode, this); - temporaryPersistenceContext.Clear(); + if (temporaryPersistenceContext.IsLoadFinished) + { + temporaryPersistenceContext.Clear(); + } return result; } } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/JoinedSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -15,6 +15,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerClassEntity(typeof (TEntity)); + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (IJoinedSubclassAttributesMapper m) => { }); + keyMapper = new JoinedSubclassKeyCustomizer<TEntity>(customizersHolder); } Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/SubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -16,6 +16,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerClassHierarchyEntity(typeof (TEntity)); + + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (ISubclassMapper m) => { }); } #region ISubclassMapper<TEntity> Members Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/CustomizersImpl/UnionSubclassCustomizer.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -13,6 +13,9 @@ throw new ArgumentNullException("explicitDeclarationsHolder"); } explicitDeclarationsHolder.AddAsTablePerConcreteClassEntity(typeof (TEntity)); + + // Add an empty customizer as a way to register the class as explicity declared + CustomizersHolder.AddCustomizer(typeof(TEntity), (IUnionSubclassAttributesMapper m) => { }); } #region Implementation of IEntityAttributesMapper Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/TypeNameUtil.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -49,14 +49,19 @@ } if (!string.IsNullOrEmpty(assembly) && string.IsNullOrEmpty(@namespace)) { - return string.Concat(type.Name, ", ", assembly); + return string.Concat(GetTypeNameForMapping(type), ", ", assembly); } if (string.IsNullOrEmpty(assembly) && !string.IsNullOrEmpty(@namespace)) { return type.FullName; } - return type.Name; + return GetTypeNameForMapping(type); } + + private static string GetTypeNameForMapping(System.Type type) + { + return !type.IsGenericType ? type.Name: type.FullName; + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/TypeNameUtilTests.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,141 @@ +using System; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode +{ + public class MyEntity + { + + } + public class MyGenericEntity<T> + { + + } + + public class TypeNameUtilTests + { + [Test] + public void WhenTypeNullThenNull() + { + System.Type variableType = null; + variableType.GetShortClassName(new HbmMapping()).Should().Be.Null(); + } + + [Test] + public void WhenMapDocNullThenAssemblyQualifiedName() + { + typeof(MyEntity).GetShortClassName(null).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMapDocHaveDefaultAssemblyThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.FullName; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName); + } + + [Test] + public void WhenMapDocHaveDefaultAssemblyNameThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.GetName().Name; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).FullName); + } + + [Test] + public void WhenMapDocHaveDefaultsThenName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyEntity).Assembly.FullName; + mapDoc.@namespace = typeof(MyEntity).Namespace; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).Name); + } + + [Test] + public void WhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = "whatever"; + typeof(MyEntity).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyEntity).AssemblyQualifiedName); + } + + [Test] + public void WhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly() + { + // strange but possible + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = typeof(MyEntity).Namespace; + typeof(MyEntity).GetShortClassName(mapDoc).Should().StartWith(typeof(MyEntity).Name).And.EndWith(", " + typeof(MyEntity).Assembly.GetName().Name); + } + + [Test] + public void WithGenericWhenMapDocNullThenAssemblyQualifiedName() + { + typeof(MyGenericEntity<int>).GetShortClassName(null).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMapDocDoesNotHaveDefaultsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultAssemblyThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultAssemblyNameThenFullName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.GetName().Name; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocHaveDefaultsThenName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = typeof(MyGenericEntity<>).Assembly.FullName; + mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).FullName); + } + + [Test] + public void WithGenericWhenMapDocDefaultsDoesNotMatchsThenAssemblyQualifiedName() + { + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = "whatever"; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().Be.EqualTo(typeof(MyGenericEntity<int>).AssemblyQualifiedName); + } + + [Test] + public void WithGenericWhenMatchNamespaceButNotAssemblyThenOnlyNameAndAssembly() + { + // strange but possible + var mapDoc = new HbmMapping(); + mapDoc.assembly = "whatever"; + mapDoc.@namespace = typeof(MyGenericEntity<>).Namespace; + typeof(MyGenericEntity<int>).GetShortClassName(mapDoc).Should().StartWith(typeof(MyGenericEntity<int>).FullName).And.EndWith(", " + typeof(MyGenericEntity<int>).Assembly.GetName().Name); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-23 18:51:34 UTC (rev 5751) @@ -600,6 +600,7 @@ <Compile Include="MappingByCode\NatureDemo\Naturalness\StateProvince.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\User.cs" /> <Compile Include="MappingByCode\NatureDemo\Naturalness\Zoo.cs" /> + <Compile Include="MappingByCode\TypeNameUtilTests.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Fixture.cs" /> <Compile Include="NHSpecificTest\AccessAndCorrectPropertyName\Model.cs" /> <Compile Include="NHSpecificTest\BagWithLazyExtraAndFilter\Domain.cs" /> @@ -814,6 +815,15 @@ <Compile Include="ReadOnly\StudentDto.cs" /> <Compile Include="ReadOnly\TextHolder.cs" /> <Compile Include="ReadOnly\VersionedNode.cs" /> + <Compile Include="Stateless\Contact.cs" /> + <Compile Include="Stateless\Country.cs" /> + <Compile Include="Stateless\FetchingLazyCollections\LazyCollectionFetchTests.cs" /> + <Compile Include="Stateless\Fetching\Resource.cs" /> + <Compile Include="Stateless\Fetching\StatelessSessionFetchingTest.cs" /> + <Compile Include="Stateless\Fetching\Task.cs" /> + <Compile Include="Stateless\Fetching\User.cs" /> + <Compile Include="Stateless\Org.cs" /> + <Compile Include="Stateless\StatelessSessionQueryFixture.cs" /> <Compile Include="Subselect\ClassSubselectFixture.cs" /> <Compile Include="Subselect\Domain.cs" /> <Compile Include="TestCaseMappingByCode.cs" /> @@ -2617,6 +2627,8 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="Stateless\Contact.hbm.xml" /> + <EmbeddedResource Include="Stateless\Fetching\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2660And2661\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\DataReaderWrapperTest\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2583\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,34 @@ +namespace NHibernate.Test.Stateless +{ + public class Contact + { + private int id; + private Org org; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + + public virtual Org Org + { + get + { + return org; + } + + set + { + org = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Contact.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Stateless"> + + <class name="Contact"> + <id name="Id"> + <generator class="native" /> + </id> + <many-to-one name="Org" lazy="false" fetch="join" /> + </class> + + <class name="Org"> + <id name="Id"> + <generator class="native" /> + </id> + <many-to-one name="Country" lazy="false" fetch="join" /> + </class> + + <class name="Country"> + <id name="Id"> + <generator class="native" /> + </id> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Country.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,20 @@ +namespace NHibernate.Test.Stateless +{ + public class Country + { + private int id; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Mappings.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Stateless.Fetching"> + <class name="User" table="User_"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Name" /> + </class> + + <class name="Resource"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Name" /> + <many-to-one name="Owner"/> + </class> + + <class name="Task"> + <id name="Id" type="long"> + <generator class="increment" /> + </id> + <property name="Description" /> + <many-to-one name="User" column="user_"/> + <many-to-one name="Resource"/> + <property name="DueDate" /> + <property name="StartDate" /> + <property name="CompletionDate" /> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Resource.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,59 @@ + +namespace NHibernate.Test.Stateless.Fetching +{ + public class Resource + { + private long? id; + private string name; + private User owner; + + public Resource() + { + } + + public Resource(string name, User owner) + { + this.name = name; + this.owner = owner; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + public virtual string Name + { + get + { + return name; + } + + set + { + this.name = value; + } + } + + public virtual User Owner + { + get + { + return owner; + } + + set + { + this.owner = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/StatelessSessionFetchingTest.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,75 @@ +using System; +using System.Collections; +using log4net; +using NUnit.Framework; + +namespace NHibernate.Test.Stateless.Fetching +{ + [TestFixture] + public class StatelessSessionFetchingTest : TestCase + { + private static readonly ILog log = LogManager.GetLogger(typeof(StatelessSessionFetchingTest)); + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get + { + return new[] { "Stateless.Fetching.Mappings.hbm.xml" }; + } + } + + [Test] + public void DynamicFetch() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + DateTime now = DateTime.Now; + User me = new User("me"); + User you = new User("you"); + Resource yourClock = new Resource("clock", you); + Task task = new Task(me, "clean", yourClock, now); // :) + s.Save(me); + s.Save(you); + s.Save(yourClock); + s.Save(task); + tx.Commit(); + } + + using (IStatelessSession ss = sessions.OpenStatelessSession()) + using (ITransaction tx = ss.BeginTransaction()) + { + ss.BeginTransaction(); + Task taskRef = + (Task)ss.CreateQuery("from Task t join fetch t.Resource join fetch t.User").UniqueResult(); + Assert.True(taskRef != null); + Assert.True(NHibernateUtil.IsInitialized(taskRef)); + Assert.True(NHibernateUtil.IsInitialized(taskRef.User)); + Assert.True(NHibernateUtil.IsInitialized(taskRef.Resource)); + Assert.False(NHibernateUtil.IsInitialized(taskRef.Resource.Owner)); + tx.Commit(); + } + + cleanup(); + } + + private void cleanup() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.BeginTransaction(); + s.CreateQuery("delete Task").ExecuteUpdate(); + s.CreateQuery("delete Resource").ExecuteUpdate(); + s.CreateQuery("delete User").ExecuteUpdate(); + tx.Commit(); + } + } + } + +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/Task.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,134 @@ +using System; + + +namespace NHibernate.Test.Stateless.Fetching +{ + public class Task + { + private long? id; + private string description; + private User user; + private Resource resource; + private DateTime dueDate; + private DateTime? startDate; + private DateTime? completionDate; + + public Task() + { + } + + public Task(User user, string description, Resource resource, DateTime dueDate) + : this(user, description, resource, dueDate, null, null) + { + } + + public Task(User user, string description, Resource resource, DateTime dueDate, DateTime? startDate, DateTime? completionDate) + { + this.user = user; + this.resource = resource; + this.description = description; + this.dueDate = dueDate; + this.startDate = startDate; + this.completionDate = completionDate; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + + public virtual User User + { + get + { + return user; + } + + set + { + this.user = value; + } + } + + + public virtual Resource Resource + { + get + { + return resource; + } + + set + { + this.resource = value; + } + } + + + public virtual string Description + { + get + { + return description; + } + + set + { + this.description = value; + } + } + + + public virtual DateTime DueDate + { + get + { + return dueDate; + } + + set + { + this.dueDate = value; + } + } + + + public virtual DateTime? StartDate + { + get + { + return startDate; + } + + set + { + this.startDate = value; + } + } + + + public virtual DateTime? CompletionDate + { + get + { + return completionDate; + } + + set + { + this.completionDate = value; + } + } + + } + +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Fetching/User.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,45 @@ + +namespace NHibernate.Test.Stateless.Fetching +{ + public class User + { + private long? id; + private string name; + + public User() + { + } + + public User(string name) + { + this.name = name; + } + + public virtual long? Id + { + get + { + return id; + } + + set + { + this.id = value; + } + } + + public virtual string Name + { + get + { + return name; + } + + set + { + this.name = value; + } + } + + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/FetchingLazyCollections/LazyCollectionFetchTests.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using Iesi.Collections.Generic; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Conformist; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.Stateless.FetchingLazyCollections +{ + public class LazyCollectionFetchTests : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.BeforeMapClass += (mi, t, cm) => cm.Id(im => im.Generator(Generators.HighLow)); + mapper.Class<Animal>(mc => + { + mc.Id(x => x.Id); + mc.Discriminator(dm => dm.Column("kind")); + mc.Property(x => x.Description); + }); + mapper.Subclass<Reptile>(mc => { mc.Property(x => x.BodyTemperature); }); + mapper.Subclass<Human>(mc => + { + mc.Property(x => x.Name); + mc.Property(x => x.NickName); + mc.Property(x => x.Birthdate, pm => pm.Type(NHibernateUtil.Date)); + }); + mapper.AddMapping<FamilyMap<Reptile>>(); + mapper.AddMapping<FamilyMap<Human>>(); + var mappings = mapper.CompileMappingForAllExplicitAddedEntities(); + return mappings; + } + + #region Nested type: FamilyMap + + private class FamilyMap<T> : ClassMapping<Family<T>> where T : Animal + { + public FamilyMap() + { + string familyOf = typeof (T).Name; + + Id(x => x.Id); + EntityName(familyOf + "Family"); + Table("Families"); + Discriminator(dm => dm.Column("familyKind")); + DiscriminatorValue(familyOf); + Where(string.Format("familyKind = '{0}'", familyOf)); + ManyToOne(x => x.Father, map => + { + map.Lazy(LazyRelation.NoLazy); + map.Class(typeof (T)); + map.Cascade(Mapping.ByCode.Cascade.All); + }); + ManyToOne(x => x.Mother, map => + { + map.Lazy(LazyRelation.NoLazy); + map.Class(typeof (T)); + map.Cascade(Mapping.ByCode.Cascade.All); + }); + Set(x => x.Childs, cam => + { + cam.Key(km => km.Column("familyId")); + cam.Cascade(Mapping.ByCode.Cascade.All); + }, + rel => rel.OneToMany()); + } + } + + #endregion + + [Test] + public void ShouldWorkLoadingComplexEntities() + { + const string crocodileFather = "Crocodile father"; + const string crocodileMother = "Crocodile mother"; + + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var rf = new Reptile { Description = crocodileFather }; + var rm = new Reptile { Description = crocodileMother }; + var rc1 = new Reptile { Description = "Crocodile" }; + var rc2 = new Reptile { Description = "Crocodile" }; + var rfamily = new Family<Reptile> + { + Father = rf, + Mother = rm, + Childs = new HashedSet<Reptile> { rc1, rc2 } + }; + s.Save("ReptileFamily", rfamily); + tx.Commit(); + } + + const string humanFather = "Fred"; + const string humanMother = "Wilma"; + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var hf = new Human { Description = "Flinstone", Name = humanFather }; + var hm = new Human { Description = "Flinstone", Name = humanMother }; + var hc1 = new Human { Description = "Flinstone", Name = "Pebbles" }; + var hfamily = new Family<Human> + { + Father = hf, + Mother = hm, + Childs = new HashedSet<Human> { hc1 } + }; + s.Save("HumanFamily", hfamily); + tx.Commit(); + } + + using (IStatelessSession s = sessions.OpenStatelessSession()) + using (ITransaction tx = s.BeginTransaction()) + { + IList<Family<Human>> hf = s.CreateQuery("from HumanFamily").List<Family<Human>>(); + Assert.That(hf.Count, Is.EqualTo(1)); + Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather)); + Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother)); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False(); + + IList<Family<Reptile>> rf = s.CreateQuery("from ReptileFamily").List<Family<Reptile>>(); + Assert.That(rf.Count, Is.EqualTo(1)); + Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather)); + Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother)); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("Lazy collection should NOT be initialized").Be.False(); + + tx.Commit(); + } + + using (ISession s = sessions.OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from HumanFamily"); + s.Delete("from ReptileFamily"); + tx.Commit(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Naturalness.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -5,7 +5,7 @@ { public abstract class Animal { - public virtual int Id { get; private set; } + public virtual int Id { get; protected set; } public virtual string Description { get; set; } } @@ -25,7 +25,7 @@ { private ISet<T> childs; - public virtual int Id { get; private set; } + public virtual int Id { get; protected set; } public virtual T Father { get; set; } public virtual T Mother { get; set; } public virtual ISet<T> Childs Added: trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/Org.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,34 @@ +namespace NHibernate.Test.Stateless +{ + public class Org + { + private int id; + private Country country; + + public virtual int Id + { + get + { + return id; + } + + set + { + id = value; + } + } + + public virtual Country Country + { + get + { + return country; + } + + set + { + country = value; + } + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -0,0 +1,118 @@ +using System.Collections; +using NHibernate.Cfg; +using NUnit.Framework; + +namespace NHibernate.Test.Stateless +{ + [TestFixture] + public class StatelessSessionQueryFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] {"Stateless.Contact.hbm.xml"}; } + } + + protected override void Configure(Configuration configuration) + { + base.Configure(configuration); + cfg.SetProperty(Environment.MaxFetchDepth, 1.ToString()); + } + + private class TestData + { + internal readonly IList list = new ArrayList(); + + private readonly ISessionFactory sessions; + + public TestData(ISessionFactory sessions) + { + this.sessions = sessions; + } + + public virtual void createData() + { + using (ISession session = sessions.OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + var usa = new Country(); + session.Save(usa); + list.Add(usa); + var disney = new Org(); + disney.Country = usa; + session.Save(disney); + list.Add(disney); + var waltDisney = new Contact(); + waltDisney.Org = disney; + session.Save(waltDisney); + list.Add(waltDisney); + tx.Commit(); + } + } + } + + public virtual void cleanData() + { + using (ISession session = sessions.OpenSession()) + { + using (ITransaction tx = session.BeginTransaction()) + { + foreach (object obj in list) + { + session.Delete(obj); + } + + tx.Commit(); + } + } + } + } + + [Test] + public void Criteria() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateCriteria<Contact>().List().Count); + } + + testData.cleanData(); + } + + [Test] + public void CriteriaWithSelectFetchMode() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateCriteria<Contact>().SetFetchMode("Org", FetchMode.Select).List().Count); + } + + testData.cleanData(); + } + + [Test] + public void Hql() + { + var testData = new TestData(sessions); + testData.createData(); + + using (IStatelessSession s = sessions.OpenStatelessSession()) + { + Assert.AreEqual(1, s.CreateQuery("from Contact c join fetch c.Org join fetch c.Org.Country").List<Contact>().Count); + } + + testData.cleanData(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-22 21:50:29 UTC (rev 5750) +++ trunk/nhibernate/src/NHibernate.Test/Stateless/StatelessWithRelationsFixture.cs 2011-04-23 18:51:34 UTC (rev 5751) @@ -2,6 +2,7 @@ using Iesi.Collections.Generic; using NUnit.Framework; using System.Collections.Generic; +using SharpTestsEx; namespace NHibernate.Test.Stateless { @@ -66,13 +67,15 @@ Assert.That(hf.Count, Is.EqualTo(1)); Assert.That(hf[0].Father.Name, Is.EqualTo(humanFather)); Assert.That(hf[0].Mother.Name, Is.EqualTo(humanMother)); - Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True(); + //Assert.That(hf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); IList<Family<Reptile>> rf = s.CreateQuery("from ReptilesFamily").List<Family<Reptile>>(); Assert.That(rf.Count, Is.EqualTo(1)); Assert.That(rf[0].Father.Description, Is.EqualTo(crocodileFather)); Assert.That(rf[0].Mother.Description, Is.EqualTo(crocodileMother)); - Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); + NHibernateUtil.IsInitialized(hf[0].Childs).Should("No lazy collection should be initialized").Be.True(); + //Assert.That(rf[0].Childs, Is.Null, "Collections should be ignored by stateless session."); tx.Commit(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-23 20:05:09
|
Revision: 5752 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5752&view=rev Author: fabiomaulo Date: 2011-04-23 20:05:03 +0000 (Sat, 23 Apr 2011) Log Message: ----------- Fix NH-1747 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyJoinWalker.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -43,11 +43,11 @@ InitStatementString(elementPersister, alias, batchSize, subquery); } - // NH-1747 FIX - //protected override string GenerateAliasForColumn(string rootAlias, string column) - //{ - // return elementPersister.GenerateTableAliasForColumn(rootAlias, column); - //} + protected override string GenerateAliasForColumn(string rootAlias, string column) + { + // NH-1747 FIX (see OneToManyPersister) + return elementPersister.GenerateTableAliasForColumn(rootAlias, column); + } private void InitStatementString(IOuterJoinLoadable elementPersister, string alias, int batchSize, SqlString subquery) { Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/OneToManyPersister.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -321,21 +321,27 @@ .ToString(); } - // NH-1747 FIX - //protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix) - //{ - // var ojl = (IOuterJoinLoadable)ElementPersister; - // var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix); - // var columnNames = KeyColumnNames; - // var columnAliases = KeyColumnAliases; - // for (int i = 0; i < columnNames.Length; i++) - // { - // var column = columnNames[i]; - // var tableAlias = ojl.GenerateTableAliasForColumn(alias, column); - // selectFragment.AddColumn(tableAlias, column, columnAliases[i]); - // } - // return selectFragment; - //} + protected override SelectFragment GenerateSelectFragment(string alias, string columnSuffix) + { + /* + NH-1747 FIX + Note: the fix for NH-1747 may cause some problem when the same ColumnName is used to represent two different properties in the same hierarchy + In all our test it happened only for NHibernate.Test.Legacy.MultiTableTest.MultiTableCollections + The mapping Multi.hbm.xml had a column named "parent" to represent the Key of a set for the relation Lower->Top and SubMulti->SubMulti everything in the same hierarchy + NH TODO: Have to add an early check of same ColumnName used to represent two relations. + */ + var ojl = (IOuterJoinLoadable)ElementPersister; + var selectFragment = new SelectFragment(Dialect).SetSuffix(columnSuffix); + var columnNames = KeyColumnNames; + var columnAliases = KeyColumnAliases; + for (int i = 0; i < columnNames.Length; i++) + { + var column = columnNames[i]; + var tableAlias = ojl.GenerateTableAliasForColumn(alias, column); + selectFragment.AddColumn(tableAlias, column, columnAliases[i]); + } + return selectFragment; + } /// <summary> /// Create the <see cref="OneToManyLoader" /> Modified: trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate.DomainModel/Multi.hbm.xml 2011-04-23 20:05:03 UTC (rev 5752) @@ -62,10 +62,10 @@ <key column="sid"/> <property name="Amount" column="dupe"/> <bag name="Children" lazy="true" inverse="true" > - <key column="parent"/> + <key column="parentId"/> <one-to-many class="NHibernate.DomainModel.SubMulti, NHibernate.DomainModel"/> </bag> - <many-to-one name="Parent" column="parent" /> + <many-to-one name="Parent" column="parentId" /> <list name="MoreChildren" lazy="true"> <key column="another_parent"/> <index column="list_ind"/> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 18:51:34 UTC (rev 5751) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1747/Fixture.cs 2011-04-23 20:05:03 UTC (rev 5752) @@ -43,7 +43,7 @@ } } - [Test, Ignore("The fix was commented in the code. Look for NH-1747")] + [Test] public void TraversingBagToJoinChildElementShouldWork() { using (ISession session = OpenSession()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-24 14:19:07
|
Revision: 5755 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5755&view=rev Author: fabiomaulo Date: 2011-04-24 14:19:01 +0000 (Sun, 24 Apr 2011) Log Message: ----------- Fix NH-2569 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs 2011-04-23 20:42:26 UTC (rev 5754) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/IdGeneratorBinder.cs 2011-04-24 14:19:01 UTC (rev 5755) @@ -40,12 +40,12 @@ var results = new Dictionary<string, string>(); if (schema != null) - results.Add(Id.PersistentIdGeneratorParmsNames.Schema, schema); - else if (mappings.SchemaName != null) - results.Add(Id.PersistentIdGeneratorParmsNames.Schema, mappings.Dialect.QuoteForSchemaName(mappings.SchemaName)); + results[Id.PersistentIdGeneratorParmsNames.Schema] = schema; + if (mappings.SchemaName != null) + results[Id.PersistentIdGeneratorParmsNames.Schema] = mappings.Dialect.QuoteForSchemaName(mappings.SchemaName); foreach (HbmParam paramSchema in generatorMapping.param ?? new HbmParam[0]) - results.Add(paramSchema.name, paramSchema.GetText()); + results[paramSchema.name] = paramSchema.GetText(); return results; } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2569/Fixture.cs 2011-04-24 14:19:01 UTC (rev 5755) @@ -0,0 +1,38 @@ +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Mapping; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; +namespace NHibernate.Test.NHSpecificTest.NH2569 +{ + public class MyClass + { + public virtual int Id { get; set; } + } + + public class Fixture + { + [Test] + public void WhenMapHiloToDifferentSchemaThanClassThenIdHasTheMappedSchema() + { + var mapper = new ModelMapper(); + mapper.Class<MyClass>(cm => + { + cm.Schema("aSchema"); + cm.Id(x => x.Id, idm => idm.Generator(Generators.HighLow, gm => gm.Params(new + { + table = "hilosequences", + schema="gSchema" + }))); + }); + var conf = new Configuration(); + conf.DataBaseIntegration(x=> x.Dialect<MsSql2008Dialect>()); + conf.AddDeserializedMapping(mapper.CompileMappingForAllExplicitAddedEntities(), "wholeDomain"); + + var mappings = conf.CreateMappings(Dialect.Dialect.GetDialect()); + var pc = mappings.GetClass(typeof(MyClass).FullName); + ((SimpleValue)pc.Identifier).IdentifierGeneratorProperties["schema"].Should().Be("gSchema"); + } + } +} \ 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-23 20:42:26 UTC (rev 5754) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-24 14:19:01 UTC (rev 5755) @@ -773,6 +773,7 @@ <Compile Include="NHSpecificTest\NH2554\Model.cs" /> <Compile Include="NHSpecificTest\NH2565\Domain.cs" /> <Compile Include="NHSpecificTest\NH2565\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2569\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2580\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2583\AbstractMassTestingFixture.cs" /> <Compile Include="NHSpecificTest\NH2583\Domain.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-25 12:13:06
|
Revision: 5759 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5759&view=rev Author: fabiomaulo Date: 2011-04-25 12:12:59 +0000 (Mon, 25 Apr 2011) Log Message: ----------- Fix NH-2661 implementing a new drive for MsSQL-2008 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs trunk/nhibernate/src/NHibernate/Driver/IDriver.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -57,7 +57,7 @@ factory = connectionManager.Factory; } - private IDriver Driver + protected IDriver Driver { get { return factory.ConnectionProvider.Driver; } } Modified: trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/AdoNet/NonBatchingBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -36,6 +36,7 @@ public override void AddToBatch(IExpectation expectation) { IDbCommand cmd = CurrentCommand; + Driver.AdjustCommand(cmd); int rowCount = ExecuteNonQuery(cmd); expectation.VerifyOutcomeNonBatched(rowCount, cmd); } Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -1,5 +1,7 @@ using System.Data; using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; using System.Text; using NHibernate.AdoNet.Util; using NHibernate.Exceptions; @@ -49,7 +51,7 @@ { totalExpectedRowsAffected += expectation.ExpectedRowCount; IDbCommand batchUpdate = CurrentCommand; - + Driver.AdjustCommand(batchUpdate); string lineWithParameters = null; var sqlStatementLogger = Factory.Settings.SqlStatementLogger; if (sqlStatementLogger.IsDebugEnabled || log.IsDebugEnabled) Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -1,5 +1,7 @@ using System.Data; +using NHibernate.Cfg; using NHibernate.Dialect.Function; +using NHibernate.Driver; namespace NHibernate.Dialect { @@ -30,5 +32,11 @@ RegisterKeyword("time"); RegisterKeyword("hierarchyid"); } + + protected override void RegisterDefaultProperties() + { + base.RegisterDefaultProperties(); + DefaultProperties[Environment.ConnectionDriver] = typeof(Sql2008ClientDriver).AssemblyQualifiedName; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -255,6 +255,7 @@ public void PrepareCommand(IDbCommand command) { + AdjustCommand(command); OnBeforePrepare(command); if (SupportsPreparingCommands && prepareSql) @@ -272,6 +273,19 @@ { } + /// <summary> + /// Override to make any adjustments to each IDbCommand object before it added to the batcher. + /// </summary> + /// <param name="command">The command.</param> + /// <remarks> + /// This method is similar to the <see cref="OnBeforePrepare"/> but, instead be called just before execute the command (that can be a batch) + /// is executed before add each single command to the batcher and before <see cref="OnBeforePrepare"/> . + /// If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it. + /// </remarks> + public virtual void AdjustCommand(IDbCommand command) + { + } + public IDbDataParameter GenerateOutputParameter(IDbCommand command) { IDbDataParameter param = GenerateParameter(command, "ReturnValue", SqlTypeFactory.Int32); Modified: trunk/nhibernate/src/NHibernate/Driver/IDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/Driver/IDriver.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -73,7 +73,7 @@ /// Prepare the <paramref name="command" /> by calling <see cref="IDbCommand.Prepare()" />. /// May be a no-op if the driver does not support preparing commands, or for any other reason. /// </summary> - /// <param name="command"></param> + /// <param name="command">The command.</param> void PrepareCommand(IDbCommand command); /// <summary> @@ -99,5 +99,15 @@ IResultSetsCommand GetResultSetsCommand(ISessionImplementor session); bool SupportsMultipleQueries { get; } + + /// <summary> + /// Make any adjustments to each IDbCommand object before it is added to the batcher. + /// </summary> + /// <param name="command">The command.</param> + /// <remarks> + /// This method should be executed before add each single command to the batcher. + /// If you have to adjust parameters values/type (when the command is full filled) this is a good place where do it. + /// </remarks> + void AdjustCommand(IDbCommand command); } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Driver/Sql2008ClientDriver.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -0,0 +1,28 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using System.Linq; + +namespace NHibernate.Driver +{ + public class Sql2008ClientDriver : SqlClientDriver + { + protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlTypes.SqlType sqlType) + { + base.InitializeParameter(dbParam, name, sqlType); + if (sqlType.DbType == DbType.Time) + { + ((SqlParameter) dbParam).SqlDbType = SqlDbType.Time; + } + } + + public override void AdjustCommand(IDbCommand command) + { + foreach (var parameter in command.Parameters.Cast<SqlParameter>().Where(x => x.SqlDbType == SqlDbType.Time && (x.Value is DateTime))) + { + var dateTimeValue = (DateTime)parameter.Value; + parameter.Value = dateTimeValue.TimeOfDay; + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-25 12:12:59 UTC (rev 5759) @@ -157,6 +157,7 @@ <Compile Include="Driver\OleDbDriver.cs" /> <Compile Include="Driver\OracleClientDriver.cs" /> <Compile Include="Driver\OracleDataClientDriver.cs" /> + <Compile Include="Driver\Sql2008ClientDriver.cs" /> <Compile Include="Driver\SqlClientDriver.cs" /> <Compile Include="Driver\BasicResultSetsCommand.cs" /> <Compile Include="Driver\SQLiteDriver.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2011-04-25 12:12:59 UTC (rev 5759) @@ -53,7 +53,6 @@ <property name="format_sql">true</property> <!-- This is the System.Data.dll provider for MSSQL Server --> - <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <property name="connection.connection_string">Server=localhost\sqlexpress;initial catalog=nhibernate;Integrated Security=SSPI</property> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs 2011-04-25 05:57:46 UTC (rev 5758) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs 2011-04-25 12:12:59 UTC (rev 5759) @@ -1,5 +1,7 @@ using System; +using NHibernate.Cfg; using NHibernate.Dialect; +using NHibernate.Driver; using NUnit.Framework; using SharpTestsEx; @@ -34,6 +36,13 @@ return dialect is MsSql2008Dialect; } + protected override void Configure(Configuration configuration) + { + // to be sure we are using the new drive + base.Configure(configuration); + configuration.DataBaseIntegration(x=> x.Driver<Sql2008ClientDriver>()); + } + [Test, Ignore("workaround to sqlserver DP, not fixed yet")] public void ShouldBeAbleToQueryEntity() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-25 13:48:38
|
Revision: 5761 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5761&view=rev Author: fabiomaulo Date: 2011-04-25 13:48:32 +0000 (Mon, 25 Apr 2011) Log Message: ----------- Fix NH-2551 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-04-25 12:15:29 UTC (rev 5760) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2011-04-25 13:48:32 UTC (rev 5761) @@ -613,7 +613,7 @@ { try { - clazz = ReflectHelper.ClassForFullName(className); + clazz = ReflectHelper.ClassForFullNameOrNull(className); } catch (Exception) { Modified: trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2011-04-25 12:15:29 UTC (rev 5760) +++ trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2011-04-25 13:48:32 UTC (rev 5761) @@ -192,37 +192,53 @@ /// the method try to find the System.Type scanning all Assemblies of the <see cref="AppDomain.CurrentDomain"/>. /// </remarks> /// <exception cref="TypeLoadException">If no System.Type was found for <paramref name="classFullName"/>.</exception> - public static System.Type ClassForFullName(string classFullName) + public static System.Type ClassForFullName(string classFullName) { - System.Type result = null; - AssemblyQualifiedTypeName parsedName = TypeNameParser.Parse(classFullName); - if (!string.IsNullOrEmpty(parsedName.Assembly)) - { - result = TypeFromAssembly(parsedName, false); - } - else - { - if (!string.IsNullOrEmpty(classFullName)) - { - Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies(); - foreach (Assembly a in ass) - { - result = a.GetType(classFullName, false, false); - if (result != null) - break; //<<<<<================ - } - } - } - if (result == null) - { - string message = "Could not load type " + classFullName + ". Possible cause: the assembly was not loaded or not specified."; - throw new TypeLoadException(message); - } + var result = ClassForFullNameOrNull(classFullName); + if (result == null) + { + string message = "Could not load type " + classFullName + ". Possible cause: the assembly was not loaded or not specified."; + throw new TypeLoadException(message); + } - return result; + return result; } - public static System.Type TypeFromAssembly(string type, string assembly, bool throwIfError) + /// <summary> + /// Load a System.Type given is't name. + /// </summary> + /// <param name="classFullName">The class FullName or AssemblyQualifiedName</param> + /// <returns>The System.Type or null</returns> + /// <remarks> + /// If the <paramref name="classFullName"/> don't represent an <see cref="System.Type.AssemblyQualifiedName"/> + /// the method try to find the System.Type scanning all Assemblies of the <see cref="AppDomain.CurrentDomain"/>. + /// </remarks> + public static System.Type ClassForFullNameOrNull(string classFullName) + { + System.Type result = null; + AssemblyQualifiedTypeName parsedName = TypeNameParser.Parse(classFullName); + if (!string.IsNullOrEmpty(parsedName.Assembly)) + { + result = TypeFromAssembly(parsedName, false); + } + else + { + if (!string.IsNullOrEmpty(classFullName)) + { + Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly a in ass) + { + result = a.GetType(classFullName, false, false); + if (result != null) + break; //<<<<<================ + } + } + } + + return result; + } + + public static System.Type TypeFromAssembly(string type, string assembly, bool throwIfError) { return TypeFromAssembly(new AssemblyQualifiedTypeName(type, assembly), throwIfError); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-25 21:13:29
|
Revision: 5762 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5762&view=rev Author: fabiomaulo Date: 2011-04-25 21:13:23 +0000 (Mon, 25 Apr 2011) Log Message: ----------- Fix NH-2505 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-04-25 13:48:32 UTC (rev 5761) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2011-04-25 21:13:23 UTC (rev 5762) @@ -213,17 +213,7 @@ // Need to check for boolean equality if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression) { - lhs = - _hqlTreeBuilder.Case( - new [] { _hqlTreeBuilder.When(lhs, _hqlTreeBuilder.Constant(true)) }, - _hqlTreeBuilder.Constant(false)); - - rhs = - _hqlTreeBuilder.Case( - new [] { _hqlTreeBuilder.When(rhs, _hqlTreeBuilder.Constant(true)) }, - _hqlTreeBuilder.Constant(false)); - - return _hqlTreeBuilder.Equality(lhs, rhs); + return ResolveBooleanEquality(expression, lhs, rhs, (l, r) => _hqlTreeBuilder.Equality(l, r)); } // Check for nulls on left or right. @@ -246,23 +236,12 @@ case ExpressionType.NotEqual: // Need to check for boolean in-equality - if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression) - { - lhs = - _hqlTreeBuilder.Case( - new [] { _hqlTreeBuilder.When(lhs, _hqlTreeBuilder.Constant(true)) }, - _hqlTreeBuilder.Constant(false)); + if (lhs is HqlBooleanExpression || rhs is HqlBooleanExpression) + { + return ResolveBooleanEquality(expression, lhs, rhs, (l, r) => _hqlTreeBuilder.Inequality(l, r)); + } - rhs = - _hqlTreeBuilder.Case( - new [] { _hqlTreeBuilder.When(rhs, _hqlTreeBuilder.Constant(true)) }, - _hqlTreeBuilder.Constant(false)); - - return _hqlTreeBuilder.Inequality(lhs, rhs); - - } - - // Check for nulls on left or right. + // Check for nulls on left or right. if (expression.Right is ConstantExpression && expression.Right.Type.IsNullableOrReference() && ((ConstantExpression)expression.Right).Value == null) @@ -330,7 +309,49 @@ throw new InvalidOperationException(); } - protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression) + private HqlTreeNode ResolveBooleanEquality(BinaryExpression expression, HqlExpression lhs, HqlExpression rhs, + Func<HqlExpression, HqlExpression, HqlTreeNode> applyResultExpressions) + { + if (!(lhs is HqlBooleanExpression) && !(rhs is HqlBooleanExpression)) + { + throw new InvalidOperationException("Invalid operators for ResolveBooleanEquality, this may indicate a bug in NHibernate"); + } + + HqlExpression leftHqlExpression = GetExpressionForBooleanEquality(expression.Left, lhs); + HqlExpression rightHqlExpression = GetExpressionForBooleanEquality(expression.Right, rhs); + return applyResultExpressions(leftHqlExpression, rightHqlExpression); + } + + private HqlExpression GetExpressionForBooleanEquality(Expression @operator, HqlExpression original) + { + //When the expression is a constant then use the constant + var operandEx = @operator as ConstantExpression; + if (operandEx != null) + { + NamedParameter namedParameter; + if (_parameters.ConstantToParameterMap.TryGetValue(operandEx, out namedParameter)) + { + _parameters.RequiredHqlParameters.Add(new NamedParameterDescriptor(namedParameter.Name, null, new[] { _parameters.RequiredHqlParameters.Count + 1 }, false)); + return _hqlTreeBuilder.Parameter(namedParameter.Name).AsExpression(); + } + + return _hqlTreeBuilder.Constant(operandEx.Value); + } + + //When the expression is a member-access not nullable then use the HbmDot + var memberAccessExpression = @operator as MemberExpression; + if (ExpressionType.MemberAccess.Equals(@operator.NodeType) && memberAccessExpression != null && typeof(bool).Equals(memberAccessExpression.Type)) + { + // this case make the difference when the property "Value" of a nullable type is used (ignore the null since the user is explicity checking the Value) + return original; + } + + //When the expression is a member-access nullable then use the "case" clause to transform it to boolean (to use always .NET meaning instead leave the DB the behavior for null) + //When the expression is a complex-expression then use the "case" clause to transform it to boolean + return _hqlTreeBuilder.Case(new[] {_hqlTreeBuilder.When(original, _hqlTreeBuilder.Constant(true))}, _hqlTreeBuilder.Constant(false)); + } + + protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression) { switch (expression.NodeType) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2505/Fixture.cs 2011-04-25 21:13:23 UTC (rev 5762) @@ -0,0 +1,175 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Linq; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2505 +{ + public class MyClass + { + public virtual Guid Id { get; set; } + public virtual bool Alive { get; set; } + public virtual bool? MayBeAlive { get; set; } + public virtual int Something { get; set; } + } + public class Fixture: TestCaseMappingByCode + { + private Regex caseClause = new Regex("case",RegexOptions.IgnoreCase); + protected override HbmMapping GetMappings() + { + var mapper = new ConventionModelMapper(); + mapper.BeforeMapClass += (mi, t, x) => x.Id(map=> map.Generator(Generators.Guid)); + return mapper.CompileMappingFor(new[] { typeof(MyClass) }); + } + + private class Scenario: IDisposable + { + private readonly ISessionFactory factory; + + public Scenario(ISessionFactory factory) + { + this.factory = factory; + using (var session= factory.OpenSession()) + { + session.Save(new MyClass { Alive = true }); + session.Save(new MyClass { Alive = false, MayBeAlive = true }); + session.Flush(); + } + } + + public void Dispose() + { + using (var session = factory.OpenSession()) + { + session.CreateQuery("delete from MyClass").ExecuteUpdate(); + session.Flush(); + } + } + } + + [Test] + public void WhenQueryConstantEqualToMemberThenDoesNotUseTheCaseConstructor() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => x.Alive == false).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0); + } + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => true == x.Alive).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0); + } + } + } + } + + [Test] + public void WhenQueryConstantNotEqualToMemberThenDoesNotUseTheCaseConstructor() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => x.Alive != false).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0); + } + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => true != x.Alive).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(0); + } + } + } + } + + [Test] + public void WhenQueryComplexEqualToComplexThentUseTheCaseConstructorForBoth() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => (5 > x.Something) == (x.Something < 10)).ToList(); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(2); + } + } + } + } + + [Test] + public void WhenQueryConstantEqualToNullableMemberThenUseTheCaseConstructorForMember() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => x.MayBeAlive == false).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1); + } + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => true == x.MayBeAlive).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1); + } + } + } + } + + [Test] + public void WhenQueryConstantEqualToNullableMemberValueThenDoesNotUseTheCaseConstructorForMember() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => x.MayBeAlive.Value == false).ToList(); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1); + } + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => true == x.MayBeAlive.Value).ToList(); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1); + } + } + } + } + + [Test] + public void WhenQueryConstantNotEqualToNullableMemberThenUseTheCaseConstructorForMember() + { + using (new Scenario(Sfi)) + { + using (var session = OpenSession()) + { + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => x.MayBeAlive != false).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(1); + } + using (var sqls = new SqlLogSpy()) + { + session.Query<MyClass>().Where(x => true != x.MayBeAlive).Should().Have.Count.EqualTo(1); + caseClause.Matches(sqls.GetWholeLog()).Count.Should().Be(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-04-25 13:48:32 UTC (rev 5761) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-25 21:13:23 UTC (rev 5762) @@ -763,6 +763,7 @@ <Compile Include="NHSpecificTest\NH2490\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2490\Model.cs" /> <Compile Include="NHSpecificTest\NH2491\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2505\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2507\Animal.cs" /> <Compile Include="NHSpecificTest\NH2507\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2527\FixtureWithNoBatcher.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-26 13:58:22
|
Revision: 5765 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5765&view=rev Author: fabiomaulo Date: 2011-04-26 13:58:16 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Fix NH-2674 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/ISession.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-04-25 23:01:50 UTC (rev 5764) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-04-26 13:58:16 UTC (rev 5765) @@ -31,6 +31,16 @@ return new QueryOver<T,T>(alias); } + public static QueryOver<T, T> Of<T>(string entityName) + { + return new QueryOver<T, T>(entityName); + } + + public static QueryOver<T, T> Of<T>(string entityName, Expression<Func<T>> alias) + { + return new QueryOver<T, T>(entityName, alias); + } + public ICriteria UnderlyingCriteria { get { return criteria; } @@ -275,6 +285,12 @@ criteria = impl; } + protected internal QueryOver(string entityName) + { + impl = new CriteriaImpl(entityName, null); + criteria = impl; + } + protected internal QueryOver(Expression<Func<TSubType>> alias) { string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body); @@ -282,6 +298,13 @@ criteria = impl; } + protected internal QueryOver(string entityName, Expression<Func<TSubType>> alias) + { + string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body); + impl = new CriteriaImpl(entityName, aliasPath, null); + criteria = impl; + } + protected internal QueryOver(CriteriaImpl impl) { this.impl = impl; Modified: trunk/nhibernate/src/NHibernate/ISession.cs =================================================================== --- trunk/nhibernate/src/NHibernate/ISession.cs 2011-04-25 23:01:50 UTC (rev 5764) +++ trunk/nhibernate/src/NHibernate/ISession.cs 2011-04-26 13:58:16 UTC (rev 5765) @@ -714,17 +714,35 @@ /// Creates a new <c>IQueryOver<T></c> for the entity class. /// </summary> /// <typeparam name="T">The entity class</typeparam> - /// <returns>An ICriteria<T> object</returns> + /// <returns>An IQueryOver<T> object</returns> IQueryOver<T,T> QueryOver<T>() where T : class; /// <summary> /// Creates a new <c>IQueryOver<T></c> for the entity class. /// </summary> /// <typeparam name="T">The entity class</typeparam> - /// <returns>An ICriteria<T> object</returns> + /// <param name="alias">The alias of the entity</param> + /// <returns>An IQueryOver<T> object</returns> IQueryOver<T,T> QueryOver<T>(Expression<Func<T>> alias) where T : class; /// <summary> + /// Creates a new <c>IQueryOver{T};</c> for the entity class. + /// </summary> + /// <typeparam name="T">The entity class</typeparam> + /// <param name="entityName">The name of the entity to Query</param> + /// <returns>An IQueryOver{T} object</returns> + IQueryOver<T, T> QueryOver<T>(string entityName) where T : class; + + /// <summary> + /// Creates a new <c>IQueryOver{T}</c> for the entity class. + /// </summary> + /// <typeparam name="T">The entity class</typeparam> + /// <param name="entityName">The name of the entity to Query</param> + /// <param name="alias">The alias of the entity</param> + /// <returns>An IQueryOver{T} object</returns> + IQueryOver<T, T> QueryOver<T>(string entityName, Expression<Func<T>> alias) where T : class; + + /// <summary> /// Create a new instance of <c>Query</c> for the given query string /// </summary> /// <param name="queryString">A hibernate query string</param> Modified: trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-04-25 23:01:50 UTC (rev 5764) +++ trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs 2011-04-26 13:58:16 UTC (rev 5765) @@ -1862,6 +1862,25 @@ } } + public IQueryOver<T, T> QueryOver<T>(string entityName) where T : class + { + using (new SessionIdLoggingContext(SessionId)) + { + CheckAndUpdateSessionStatus(); + return new QueryOver<T, T>(new CriteriaImpl(entityName, this)); + } + } + + public IQueryOver<T, T> QueryOver<T>(string entityName, Expression<Func<T>> alias) where T : class + { + using (new SessionIdLoggingContext(SessionId)) + { + CheckAndUpdateSessionStatus(); + string aliasPath = ExpressionProcessor.FindMemberExpression(alias.Body); + return new QueryOver<T, T>(new CriteriaImpl(entityName, aliasPath, this)); + } + } + public override IList List(CriteriaImpl criteria) { using (new SessionIdLoggingContext(SessionId)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-26 17:18:06
|
Revision: 5766 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5766&view=rev Author: fabiomaulo Date: 2011-04-26 17:17:59 +0000 (Tue, 26 Apr 2011) Log Message: ----------- preparing the painful note (composite-id) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/ICompositeIdMapper.cs 2011-04-26 17:17:59 UTC (rev 5766) @@ -0,0 +1,28 @@ +namespace NHibernate.Mapping.ByCode +{ + public interface ICompositeIdAttributesMapper {} + + public interface ICompositeIdMapper : ICompositeIdAttributesMapper, IMinimalPlainPropertyContainerMapper {} + + public interface IComponentAsIdAttributesMapper : IAccessorPropertyMapper + { + /// <summary> + /// Force the component to a different type than the one of the property. + /// </summary> + /// <param name="componentType">Mapped component type.</param> + /// <remarks> + /// Useful when the property is an interface and you need the mapping to a concrete class mapped as component. + /// </remarks> + void Class(System.Type componentType); + } + + public interface IComponentAsIdMapper : IComponentAsIdAttributesMapper, IMinimalPlainPropertyContainerMapper { } + + public interface IComponentAsIdAttributesMapper<TComponent> : IAccessorPropertyMapper + { + void Class<TConcrete>() where TConcrete : TComponent; + } + + public interface IComponentAsIdMapper<TComponent> : IComponentAsIdAttributesMapper<TComponent>, IMinimalPlainPropertyContainerMapper<TComponent> where TComponent : class { } + +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-26 13:58:16 UTC (rev 5765) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IPlainPropertyContainerMapper.cs 2011-04-26 17:17:59 UTC (rev 5766) @@ -5,14 +5,17 @@ namespace NHibernate.Mapping.ByCode { - public interface IBasePlainPropertyContainerMapper + public interface IMinimalPlainPropertyContainerMapper { void Property(MemberInfo property, Action<IPropertyMapper> mapping); + void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping); + } + public interface IBasePlainPropertyContainerMapper : IMinimalPlainPropertyContainerMapper + { void Component(MemberInfo property, Action<IComponentMapper> mapping); void Component(MemberInfo property, Action<IDynamicComponentMapper> mapping); - void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping); void Any(MemberInfo property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping); } @@ -21,12 +24,18 @@ void OneToOne(MemberInfo property, Action<IOneToOneMapper> mapping); } - public interface IBasePlainPropertyContainerMapper<TContainer> + public interface IMinimalPlainPropertyContainerMapper<TContainer> { 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 ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property, Action<IManyToOneMapper> mapping) where TProperty : class; + void ManyToOne<TProperty>(Expression<Func<TContainer, TProperty>> property) where TProperty : class; + } + + public interface IBasePlainPropertyContainerMapper<TContainer> : IMinimalPlainPropertyContainerMapper<TContainer> + { 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; @@ -35,9 +44,6 @@ TComponent dynamicComponentTemplate, Action<IDynamicComponentMapper<TComponent>> mapping) where TComponent : class; - 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 Any<TProperty>(Expression<Func<TContainer, TProperty>> property, System.Type idTypeOfMetaType, Action<IAnyMapper> mapping) where TProperty : class; } Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 13:58:16 UTC (rev 5765) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 17:17:59 UTC (rev 5766) @@ -295,6 +295,7 @@ <Compile Include="Mapping\ByCode\Conformist\JoinedSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\Conformist\SubclassMapping.cs" /> <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> + <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-26 19:20:46
|
Revision: 5768 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5768&view=rev Author: fabiomaulo Date: 2011-04-26 19:20:39 +0000 (Tue, 26 Apr 2011) Log Message: ----------- ComposedIdMapper Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-26 19:20:39 UTC (rev 5768) @@ -0,0 +1,52 @@ +using System; +using System.Linq; +using System.Reflection; +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode.Impl +{ + public class ComposedIdMapper : IComposedIdMapper + { + private readonly HbmCompositeId id; + private readonly HbmMapping mapDoc; + + public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc) + { + this.id = id; + this.mapDoc = mapDoc; + } + + public HbmCompositeId ComposedId + { + get { return id; } + } + + #region IComposedIdMapper Members + + public void Property(MemberInfo property, Action<IPropertyMapper> mapping) + { + var hbmProperty = new HbmKeyProperty {name = property.Name}; + mapping(new KeyPropertyMapper(property, hbmProperty)); + AddProperty(hbmProperty); + } + + public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + { + var hbm = new HbmKeyManyToOne {name = property.Name}; + mapping(new KeyManyToOneMapper(property, hbm, mapDoc)); + AddProperty(hbm); + } + + #endregion + + protected void AddProperty(object property) + { + if (property == null) + { + throw new ArgumentNullException("property"); + } + var toAdd = new[] {property}; + id.Items = id.Items == null ? toAdd : id.Items.Concat(toAdd).ToArray(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 17:36:57 UTC (rev 5767) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768) @@ -297,6 +297,7 @@ <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.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/MappersTests/ComposedIdMapperTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-26 19:20:39 UTC (rev 5768) @@ -0,0 +1,76 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class ComposedIdMapperTests + { + private class Person + { + public string Email { get; set; } + public User User { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void CanMapProperty() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComposedIdMapper(compositeId, mapdoc); + + mapper.Property(For<Person>.Property(ts => ts.Email), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>(); + compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email"); + } + + [Test] + public void CallPropertyMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComposedIdMapper(compositeId, mapdoc); + var called = false; + + mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void CanMapManyToOne() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComposedIdMapper(compositeId, mapdoc); + + mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>(); + compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User"); + } + + [Test] + public void CallMapManyToOneMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComposedIdMapper(compositeId, mapdoc); + var called = false; + + mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true); + + called.Should().Be.True(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 17:36:57 UTC (rev 5767) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 19:20:39 UTC (rev 5768) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\ComposedIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\ComponentPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-26 22:15:57
|
Revision: 5769 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5769&view=rev Author: fabiomaulo Date: 2011-04-26 22:15:51 +0000 (Tue, 26 Apr 2011) Log Message: ----------- ComponentAsIdMapper Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs Added: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComponentAsIdMapper.cs 2011-04-26 22:15:51 UTC (rev 5769) @@ -0,0 +1,66 @@ +using System; +using System.Linq; +using System.Reflection; +using NHibernate.Cfg.MappingSchema; + +namespace NHibernate.Mapping.ByCode.Impl +{ + public class ComponentAsIdMapper: IComponentAsIdMapper + { + private readonly IAccessorPropertyMapper accessorPropertyMapper; + private readonly HbmCompositeId id; + private readonly HbmMapping mapDoc; + + public ComponentAsIdMapper(System.Type componentType, MemberInfo declaringTypeMember, HbmCompositeId id, HbmMapping mapDoc) + { + this.id = id; + this.mapDoc = mapDoc; + id.@class = componentType.GetShortClassName(mapDoc); + accessorPropertyMapper = new AccessorPropertyMapper(declaringTypeMember.DeclaringType, declaringTypeMember.Name, x => id.access = x); + } + + public HbmCompositeId CompositeId + { + get { return id; } + } + + public void Access(Accessor accessor) + { + accessorPropertyMapper.Access(accessor); + } + + public void Access(System.Type accessorType) + { + accessorPropertyMapper.Access(accessorType); + } + + public void Class(System.Type componentType) + { + id.@class = componentType.GetShortClassName(mapDoc); + } + + public void Property(MemberInfo property, Action<IPropertyMapper> mapping) + { + var hbmProperty = new HbmKeyProperty { name = property.Name }; + mapping(new KeyPropertyMapper(property, hbmProperty)); + AddProperty(hbmProperty); + } + + public void ManyToOne(MemberInfo property, Action<IManyToOneMapper> mapping) + { + var hbm = new HbmKeyManyToOne { name = property.Name }; + mapping(new KeyManyToOneMapper(property, hbm, mapDoc)); + AddProperty(hbm); + } + + protected void AddProperty(object property) + { + if (property == null) + { + throw new ArgumentNullException("property"); + } + var toAdd = new[] { property }; + id.Items = id.Items == null ? toAdd : id.Items.Concat(toAdd).ToArray(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 19:20:39 UTC (rev 5768) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-26 22:15:51 UTC (rev 5769) @@ -297,6 +297,7 @@ <Compile Include="Mapping\ByCode\Conformist\UnionSubclassMapping.cs" /> <Compile Include="Mapping\ByCode\ICompositeIdMapper.cs" /> <Compile Include="Mapping\ByCode\IDynamicComponentAttributesMapper.cs" /> + <Compile Include="Mapping\ByCode\Impl\ComponentAsIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\ComposedIdMapper.cs" /> <Compile Include="Mapping\ByCode\Impl\CustomizersImpl\DynamicComponentCustomizer.cs" /> <Compile Include="Mapping\ByCode\Impl\DynamicComponentMapper.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComponentAsIdTests.cs 2011-04-26 22:15:51 UTC (rev 5769) @@ -0,0 +1,93 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class ComponentAsIdTests + { + private class PersonId + { + public string Email { get; set; } + public User User { get; set; } + } + + private class Person + { + public PersonId Id { get; set; } + public string Name { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenCreatedThenSetTheComponentClass() + { + var mapdoc = new HbmMapping(); + var component = new HbmCompositeId(); + new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x=> x.Id), component, mapdoc); + + component.@class.Should().Contain("PersonId"); + } + + [Test] + public void CanMapProperty() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + + mapper.Property(For<PersonId>.Property(ts => ts.Email), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyProperty>(); + compositeId.Items.OfType<HbmKeyProperty>().First().Name.Should().Be.EqualTo("Email"); + } + + [Test] + public void CallPropertyMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + var called = false; + + mapper.Property(For<PersonId>.Property(ts => ts.Email), x => called = true); + + called.Should().Be.True(); + } + + [Test] + public void CanMapManyToOne() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + + mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => { }); + + compositeId.Items.Should().Have.Count.EqualTo(1); + compositeId.Items.First().Should().Be.OfType<HbmKeyManyToOne>(); + compositeId.Items.OfType<HbmKeyManyToOne>().First().Name.Should().Be.EqualTo("User"); + } + + [Test] + public void CallMapManyToOneMapper() + { + var mapdoc = new HbmMapping(); + var compositeId = new HbmCompositeId(); + var mapper = new ComponentAsIdMapper(typeof(PersonId), For<Person>.Property(x => x.Id), compositeId, mapdoc); + var called = false; + + mapper.ManyToOne(For<PersonId>.Property(ts => ts.User), x => called = true); + + called.Should().Be.True(); + } + + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 19:20:39 UTC (rev 5768) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-26 22:15:51 UTC (rev 5769) @@ -551,6 +551,7 @@ <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> + <Compile Include="MappingByCode\MappersTests\ComponentAsIdTests.cs" /> <Compile Include="MappingByCode\MappersTests\ComposedIdMapperTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\AnyPropertyOnDynamicCompoTests.cs" /> <Compile Include="MappingByCode\MappersTests\DynamicComponentMapperTests\BagPropertyOnDynamicCompoTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 12:09:01
|
Revision: 5771 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5771&view=rev Author: fabiomaulo Date: 2011-04-27 12:08:50 +0000 (Wed, 27 Apr 2011) Log Message: ----------- ClassMapper with ComponentAsId and ComposedId Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/IClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -8,6 +8,10 @@ { void Id(Action<IIdMapper> idMapper); void Id(MemberInfo idProperty, Action<IIdMapper> idMapper); + + void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> idMapper); + void ComposedId(Action<IComposedIdMapper> idPropertiesMapping); + void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); @@ -37,6 +41,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 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 Discriminator(Action<IDiscriminatorMapper> discriminatorMapping); void DiscriminatorValue(object value); void Table(string tableName); Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -68,6 +68,32 @@ mapper(new IdMapper(idProperty, id)); } + public void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> mapper) + { + if (!IsMemberSupportedByMappedContainer(idProperty)) + { + throw new ArgumentOutOfRangeException("idProperty", "Can't use, as component id property, a property of another graph"); + } + var id = classMapping.Item as HbmCompositeId; + if(id == null) + { + id = new HbmCompositeId(); + classMapping.Item = id; + } + mapper(new ComponentAsIdMapper(idProperty.GetPropertyOrFieldType(), idProperty, id, mapDoc)); + } + + public void ComposedId(Action<IComposedIdMapper> idPropertiesMapping) + { + var id = classMapping.Item as HbmCompositeId; + if (id == null) + { + id = new HbmCompositeId(); + classMapping.Item = id; + } + idPropertiesMapping(new ComposedIdMapper(Container, id, mapDoc)); + } + public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping) { if (discriminatorMapper == null) Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ComposedIdMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -7,11 +7,13 @@ { public class ComposedIdMapper : IComposedIdMapper { + private readonly System.Type container; private readonly HbmCompositeId id; private readonly HbmMapping mapDoc; - public ComposedIdMapper(HbmCompositeId id, HbmMapping mapDoc) + public ComposedIdMapper(System.Type container, HbmCompositeId id, HbmMapping mapDoc) { + this.container = container; this.id = id; this.mapDoc = mapDoc; } Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComponetAsIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -0,0 +1,85 @@ +using System; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests +{ + public class ComponetAsIdTests + { + private class PersonId + { + public string Email { get; set; } + public User User { get; set; } + } + + private class Person + { + private PersonId id; + public PersonId Id + { + get { return id; } + } + + public string Name { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenClassWithComponentIdThenTheIdIsConpositeId() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => + { + map.Property(For<PersonId>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { }); + }); + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Should().Not.Be.Null(); + hbmCompositeId.@class.Should().Not.Be.Null(); + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty),typeof(HbmKeyManyToOne)); + } + + [Test] + public void WhenComponentIdCustomizedMoreThanOnceThenMerge() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => + { + map.Property(For<PersonId>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<PersonId>.Property(x => x.User), pm => { }); + }); + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Access(Accessor.Field)); + + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.access.Should().Contain("field"); + } + + [Test] + public void WhenMapExternalMemberAsComponentIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.Executing(m => m.ComponentAsId(For<User>.Property(x => x.Id), map => map.Access(Accessor.Field))).Throws<ArgumentOutOfRangeException>(); + } + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/ComposedIdTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -0,0 +1,57 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests +{ + public class ComposedIdTests + { + private class Person + { + public string Email { get; set; } + public User User { get; set; } + } + + private class User + { + public int Id { get; set; } + } + + [Test] + public void WhenClassWithComposedIdThenTheIdIsConpositeId() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, null); + + mapper.ComposedId(map => + { + map.Property(For<Person>.Property(x => x.Email), pm => { }); + map.ManyToOne(For<Person>.Property(x => x.User), pm => { }); + }); + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Should().Not.Be.Null(); + hbmCompositeId.@class.Should().Be.Null(); + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + hbmCompositeId.Items.Select(x => x.GetType()).Should().Have.SameValuesAs(typeof(HbmKeyProperty), typeof(HbmKeyManyToOne)); + } + + [Test] + public void WhenComposedIdCustomizedMoreThanOnceThenMerge() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, null); + + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Email), pm => { })); + mapper.ComposedId(map => map.ManyToOne(For<Person>.Property(x => x.User), pm => { })); + + var hbmClass = mapdoc.RootClasses[0]; + hbmClass.Id.Should().Be.Null(); + var hbmCompositeId = hbmClass.CompositeId; + hbmCompositeId.Items.Should().Have.Count.EqualTo(2); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ComposedIdMapperTests.cs 2011-04-27 12:08:50 UTC (rev 5771) @@ -24,7 +24,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); mapper.Property(For<Person>.Property(ts => ts.Email), x => { }); @@ -38,7 +38,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); var called = false; mapper.Property(For<Person>.Property(ts => ts.Email), x => called = true); @@ -51,7 +51,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => { }); @@ -65,7 +65,7 @@ { var mapdoc = new HbmMapping(); var compositeId = new HbmCompositeId(); - var mapper = new ComposedIdMapper(compositeId, mapdoc); + var mapper = new ComposedIdMapper(typeof(Person), compositeId, mapdoc); var called = false; mapper.ManyToOne(For<Person>.Property(ts => ts.User), x => called = true); Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 09:49:57 UTC (rev 5770) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 12:08:50 UTC (rev 5771) @@ -549,6 +549,8 @@ <Compile Include="MappingByCode\For.cs" /> <Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ClassMapperWithJoinPropertiesTest.cs" /> + <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComponetAsIdTests.cs" /> + <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComposedIdTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\SetPersisterTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\TablesSincronizationTests.cs" /> <Compile Include="MappingByCode\MappersTests\CollectionIdMapperTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2011-04-27 13:51:46
|
Revision: 5772 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5772&view=rev Author: fabiomaulo Date: 2011-04-27 13:51:34 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Implemented ambiguous mapping checking for Id Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 12:08:50 UTC (rev 5771) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/ClassMapper.cs 2011-04-27 13:51:34 UTC (rev 5772) @@ -11,6 +11,9 @@ { private readonly HbmClass classMapping; private readonly IIdMapper idMapper; + private bool simpleIdPropertyWasUsed; + private bool composedIdWasUsed; + private bool componentAsIdWasUsed; private Dictionary<string, IJoinMapper> joinMappers; private ICacheMapper cacheMapper; private IDiscriminatorMapper discriminatorMapper; @@ -64,16 +67,40 @@ public void Id(MemberInfo idProperty, Action<IIdMapper> mapper) { - var id = (HbmId) classMapping.Item; + var id = classMapping.Item as HbmId; + if(id == null) + { + var propertyDescription = idProperty != null ? " '" + idProperty.Name + "'" : ", with generator, "; + throw new MappingException(string.Format("Abiguous mapping of {0} id. A ComponentAsId or a ComposedId was used and you are trying to map the property{1} as id.", + Container.FullName, propertyDescription)); + } mapper(new IdMapper(idProperty, id)); + if(idProperty != null) + { + simpleIdPropertyWasUsed = true; + } } public void ComponentAsId(MemberInfo idProperty, Action<IComponentAsIdMapper> mapper) { + if (idProperty == null) + { + return; + } if (!IsMemberSupportedByMappedContainer(idProperty)) { throw new ArgumentOutOfRangeException("idProperty", "Can't use, as component id property, a property of another graph"); } + if (composedIdWasUsed) + { + throw new MappingException(string.Format("Abiguous mapping of {0} id. A composed id was defined and you are trying to map the component {1}, of property '{2}', as id for {0}." + , Container.FullName, idProperty.GetPropertyOrFieldType().FullName, idProperty.Name)); + } + if (simpleIdPropertyWasUsed) + { + throw new MappingException(string.Format("Abiguous mapping of {0} id. An id property, with generator, was defined and you are trying to map the component {1}, of property '{2}', as id for {0}." + , Container.FullName, idProperty.GetPropertyOrFieldType().FullName, idProperty.Name)); + } var id = classMapping.Item as HbmCompositeId; if(id == null) { @@ -81,10 +108,20 @@ classMapping.Item = id; } mapper(new ComponentAsIdMapper(idProperty.GetPropertyOrFieldType(), idProperty, id, mapDoc)); + componentAsIdWasUsed = true; } public void ComposedId(Action<IComposedIdMapper> idPropertiesMapping) { + if(componentAsIdWasUsed) + { + throw new MappingException(string.Format("Abiguous mapping of {0} id. A Component as id was used and you are trying to map an id composed by various properties of {0}.", Container.FullName)); + } + if (simpleIdPropertyWasUsed) + { + throw new MappingException(string.Format("Abiguous mapping of {0} id. An id property, with generator, was defined and you are trying to map an id composed by various properties of {0}.", Container.FullName)); + } + var id = classMapping.Item as HbmCompositeId; if (id == null) { @@ -92,6 +129,7 @@ classMapping.Item = id; } idPropertiesMapping(new ComposedIdMapper(Container, id, mapDoc)); + composedIdWasUsed = true; } public void Discriminator(Action<IDiscriminatorMapper> discriminatorMapping) Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/ClassMapperTests/CheckMixingPOIDStrategiesTests.cs 2011-04-27 13:51:34 UTC (rev 5772) @@ -0,0 +1,99 @@ +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests.ClassMapperTests +{ + public class CheckMixingPoidStrategiesTests + { + private class PersonId + { + public string Email { get; set; } + } + + private class Person + { + private PersonId id; + public PersonId Id + { + get { return id; } + } + + public int Poid { get; set; } + public string Name { get; set; } + } + + [Test] + public void WhenMixComposedIdWithComponentAsIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof (Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { })); + Executing.This(() => + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { })) + ).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMixComponentAsIdWithComposedIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { })); + Executing.This(() => + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { })) + ).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMixComposedIdWithSimpleIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { })); + Executing.This(() => + mapper.Id(For<Person>.Property(x => x.Poid), pm => { }) + ).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMixComponentAsIdWithSimpleIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { })); + Executing.This(() => + mapper.Id(For<Person>.Property(x => x.Poid), pm => { }) + ).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMixSimpleIdWithComposedIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.Id(For<Person>.Property(x => x.Poid), pm => { }); + Executing.This(() => + mapper.ComposedId(map => map.Property(For<Person>.Property(x => x.Name), pm => { })) + ).Should().Throw<MappingException>(); + } + + [Test] + public void WhenMixSimpleIdWithComponentAsIdThenThrows() + { + var mapdoc = new HbmMapping(); + var mapper = new ClassMapper(typeof(Person), mapdoc, For<Person>.Property(x => x.Id)); + + mapper.Id(For<Person>.Property(x => x.Poid), pm => { }); + Executing.This(() => + mapper.ComponentAsId(For<Person>.Property(x => x.Id), map => map.Property(For<PersonId>.Property(x => x.Email), pm => { })) + ).Should().Throw<MappingException>(); + } + } +} \ 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-27 12:08:50 UTC (rev 5771) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-04-27 13:51:34 UTC (rev 5772) @@ -548,6 +548,7 @@ <Compile Include="MappingByCode\ExpliticMappingTests\VersionTests.cs" /> <Compile Include="MappingByCode\For.cs" /> <Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" /> + <Compile Include="MappingByCode\MappersTests\ClassMapperTests\CheckMixingPOIDStrategiesTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ClassMapperWithJoinPropertiesTest.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComponetAsIdTests.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\ComposedIdTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |